Transformação de documentos XML César Vittori cvittori@inf.ufrgs.br Outubro de 2000 Resumo XSLT: Transformações XSL. Transformação de documentos XML. XSLT
Introdução XSLT: transformações XSL (inglês: XSL Transformation ) Transformação de um documento XML para uma representação diferente templates de transformação são aplicados a objetos XML a entrada é sempre XML a saída pode ser XML, HTML, etc. XSLT 1
Padrão XSLT O padrão surge para auxiliar no processo de publicação de um documento transformar um documento XML com uma estrutura arbitrária para um documento que esteja de acordo com a sintaxe FO DTD Embora o padrão tenha sido desenvolvido para transformar XML para XML, é possível obter como saída qualquer formato baseado em texto XSLT 2
Padrão XSLT (cont.) Descreve um mecanismo para transformar dados XML de entrada para uma representação diferente É possível: adicionar prefixos e/ou sufixos ao conteúdo eliminar, criar, reestruturar e ordenar elementos reusar elementos em qualquer parte do documento transformar dados de um formato XML para outro formato baseado em texto (XML, HTML, TeX, etc.) especificar os objetos de formatação XSL que são aplicados a cada classe de elementos XSLT 3
Processador XSLT Um processador XSLT... recebe como entrada um documento XML gera como saída um novo documento XML O documento de saída é estruturado de acordo com uma DTD diferente à DTD de entrada esta transformação é especificada em um style sheet o style sheet segue a sintaxe do padrão XSLT XSLT 4
Style sheets Um style sheet é formado por um conjunto de regras template transformações são executadas de acordo com tais regras Cada regra casa com um tipo de elemento no documento de entrada utilizando expressões XPath As tags originais são substituídas por novas tags de saída XSLT 5
Exemplo: regra simples Texto em itálico é apresentado em linha e com formato negrito <template match="emph"> <fo:inline-sequence font-weight="bold"> <apply-templates/> </fo:inline-sequence> </template> Utilização de namespaces para identificar instruções de transformação e instruções de formatação ( fo: elementos FO DTD) XSLT 6
Gerando conteúdo Um template pode adicionar texto fixo nos dados de saída Exemplo: mensagens de warnings sempre começam com a palavra WAR- NING em negrito <warning>este é um warning</warning> WARNING: Este é um warning *** XSLT 7
Manipulando informação Um style sheet pode: filtrar informação contida no documento de entrada mover informação de um lugar para outro ordenar informação localizar informação e reusá-la em diferentes lugares XSLT 8
Exemplo: localizando e reusando informação <book> <review>este livro trata de <kw>xml</kw> e <kw>xsl</kw>, assim como também <kw>css</kw> é introduzido.</review> </book> A seguinte saída pode ser gerada no documento de saída: KEYWORDS: XML, XSL, CSS Utilidade para construir tabelas de conteúdo, lista de figuras, etc. XSLT 9
Gerando código HTML Um style sheet pode transformar dados XML em sintaxe HTML Exemplo: HTML os parágrafos são transformados para o elemento <P> em <template match="para"> <html:p><apply-templates/></html:p> </template> XSLT 10
Style sheet XSLT Um style sheet XSLT é identificado pelo namespace: http://www.w3.org/xsl/transform/1.0 O formato é definido em uma DTD que descreve elementos e atributos utilizados para construir um style sheet exemplos: apply-templates, for-each, value-of, etc. Um style sheet é um documento XML bem formado XSLT 11
Estrutura geral O elemento raiz é denominado stylesheet O resto dos elementos definidos no padrão formam parte do namespace... <stylesheet xmlns="http://www.w3.org/xsl/transform/1.0">... </stylesheet> O elemento transform pode ser utilizado no lugar do stylesheet XSLT 12
Utilizando mais de um namespace Um style sheet pode conter elementos que não formam parte do padrão utilizados para gerar o documento de saída O namespace destes elementos deve ser declarado <stylesheet xmlns="http://www.w3.org/xsl/transform/1.0"> xmlns:x=".........">...... <X:meu-elemento>... </X:meu-elemento> </stylesheet> XSLT 13
Namespace do resultado O atributo result-ns (Result Namespace) é utilizado para identificar o prefixo que representa o namespace do documento de saída Exemplo: <stylesheet xmlns="http://www.w3.org/xsl/transform/1.0"> xmlns:x="........." result-ns="x"> XSLT 14
Embutindo o style sheet em um documento XML Um style sheet pode estar contido em um documento XML utilidade quando o style sheet somente é aplicado ao documento considerado A instrução de processamento xml-stylesheet no documento XML aponta para o style sheet embutido utilizando uma expressão XPointer o elemento style sheet apontado possui um atributo id XSLT 15
Embutindo o style sheet em um documento XML (cont.) Exemplo: <?xml-stylesheet type="#mystyles"?> <X:book> <stylesheet id="mystyles"... >... </stylesheet>... </X:book> XSLT 16
Espaços brancos O processador XSLT cria uma árvore de nodos quando processa o documento de entrada incluindo nodos para string de texto entre instruções de marcação <book> <para>um parágrafo.</para> </book> Os espaços brancos são preservados por default XSLT 17
Removendo espaços brancos Os espaços brancos são removidos utilizando o atributo default-space no elemento stylesheet Neste caso, o elemento preserve-space é utilizado para especificar uma lista de elementos nos quais os espaços brancos devem ser preservados Exemplo: <stylesheet... default-space="strip"> <preserve-space elements="para title"/> </stylesheet> XSLT 18
Indentando o resultado O atributo indent-result é utilizado para indentar os dados de saída de acordo com sua estrutura hierárquica o default é no Exemplo: <stylesheet... indent-result="yes"> XSLT 19
Espaços brancos em elementos de texto O processador XSLT ignora os espaços brancos sempre que os mesmos não estejam contidos em um elemento de texto o elemento text é utilizado para preservar espaços Exemplo: insere um espaço na saída <text> </text> XSLT 20
Templates Um style sheet é formado por um conjunto de regras template uma regra template é identificada pelo elemento template Sintaxe: <template... >... </template> XSLT 21
Template para um determinado elemento Cada template define a transformação que é aplicada a um elemento no documento de entrada o atributo match casa com um nome de elemento Exemplo: regra para os elementos para <template match="para">... </template> XSLT 22
Expressões XPath no atributo match Regras de matching mais elaboradas podem ser escritas utilizando expressões XPath utilidade quando um elemento deve ser formatado de diferentes formas segundo o seu contexto Exemplo: regra definindo o formato para os parágrafos contidos em elementos warning <template match="warning/para">... </template> XSLT 23
Importando definições Um conjunto de regras podem ser armazenadas em um style sheet e referenciadas por múltiplos style sheets utilidade para compartilhar definições e evitar duplicações O elemento import é utilizado para importar um conjunto de regras <stylesheet... > <import href="tables.xsl"> <import href="colours.xsl"> <template... XSLT 24
Inserindo definições O elemento include é utilizado para inserir regras definidas em outros style sheets <include href="... "> Diferenças entre import e include: na resolução de conflitos quando mais de uma regra existe para um elemento as regras inseridas tomam precedência o elemento include pode ser utilizado em qualquer parte do style sheet, o elemento import somente antes da primeira regra template XSLT 25
Processamento recursivo Para trabalhar com um documento XML é necessário executar um processamento recursivo começando pelo elemento raiz e seus filhos, continuando pelos filhos de cada filho, etc. Em XSLT é necessário especificar quais os elementos da árvore XML que devem ser processados o elemento apply-templates é utilizado para indicar que os filhos do elemento corrente devem ser processados XSLT 26
Processando elementos Exemplo: processa os filhos do elemento para e os filhos do elemento bold <para>uma <bold>palavra</bold> preta.</para> <template match="para"> <apply-templates/> </template> <template match="bold"> <apply-templates/> </template> XSLT 27
Regras default Existem regras default que aplicam a todos os elementos Exemplo: especifica que todos os elementos devem ser processados <template match="/ *"> <apply-templates/> </template> * representa qualquer elemento (padrão XPath) / representa o elemento raiz Comentários e instruções de processamento não são processados por default XSLT 28
Regras default (cont.) As regras default podem ser sobrescritas para modificar seu comportamento exemplo: nenhum elemento é processado incluindo a regra vazia <template match="/ *"> </template> Utilidade para processar determinados elementos na árvore somente serão processados os elementos que casarem com os templates restantes XSLT 29
Regra defaut text() Apresenta o conteúdo texto de cada elemento Exemplo: <template match="text()"> <value-of select="."/> </template> text() representa um string de texto. o elemento corrente value-of insere o valor do elemento selecionado XSLT 30
Processamento seletivo O atributo select do elemento apply-templates é utilizado para selecionar determinados filhos para serem processados e ignorar o resto Exemplo: seleciona os elementos name que possuam um atributo de nome type cujo valor é company <template match="names"> <apply-templates select="name[@type= company ]"/> </template> O valor do atributo corresponde a uma expressão XPath XSLT 31
Selecionando elementos não filhos O operador // representa uma posição arbitrária na árvore Exemplo: insere títulos de capítulos na introdução <template match="intro"> <apply-templates select="//chapter/title"/> </template> XSLT 32
Elemento apply-templates O elemento apply-templates pode aparecer mais de uma vez em um template Exemplo: insere títulos de capítulos após o conteúdo da introdução <template match="intro"> <apply-templates/> <apply-templates select="//chapter/title"/> </template> XSLT 33
Formatos de saída Um processo XSLT produz como saída um novo documento um documento XML estrutura de diferente forma, um documento HTML ou outro formato de texto Elementos inseridos nos templates formam parte da saída gerada Exemplo: um parágrafo corresponde com um elemento P em HTML <template match="para"> <html:p><apply-templates/></html:p> </template> XSLT 34
Inserindo comentários e instruções de processamento Exemplo: o exemplo insere uma instrução de processamento e um comentário antes do corpo da página HTML <template match="book"> <processing-instruction name="acme"> INSERT_TOC <processing-instruction> <comment>este é a versão HTML</comment> <html:body><apply-templates/></html:body> </template> XSLT 35
Inserindo comentários e instruções de processamento (cont.) Saída gerada no exemplo anterior <?ACME INSERT_TOC?> <!--Esta é a versão HTML--> <body>... </body> XSLT 36
Prefixos e sufixos Um template pode adicionar texto ao conteúdo de um elemento prefixo: o texto aparece antes do elemento apply-templates sufixo: o texto aparece depois do elemento apply-templates Exemplo: adiciona o prefixo NOTE: e o sufixo ] ao conteúdo do elemento note <template match="note"> <html:p>note: <apply-templates/> </template> ]</html:p> XSLT 37
Ordenando elementos O elemento sort é utilizado para ordenar uma lista de elementos atua sobre os elementos selecionados pelo elemento apply-templates Os elementos são ordenados no documento de saída XSLT 38
Exemplo: ordenando elementos Exemplo: ordena alfabeticamente a lista de ítens <list> <item>zzz</item> <item>aaa</item> <item>mmm</item> </list> <template match="list"> <apply-templates><sort/></apply-templates> </template> XSLT 39
Ordenando por atributos O atributo select do elemento sort é utilizado para especificar o critério pelo qual ordenar Exemplo: os ítens possuem o atributo sortcode que serve como chave para ordenar a lista <list> <item sortcode="z">... </item> <item sortcode="m">... </item> </list> <sort select="@sortcode"/> XSLT 40
Ordenando por várias chaves É possível utilizar mais de um elemento sort para ordenar elementos em diferentes níveis Exemplo: ordena primeiro por second-name, e depois por first-name no grupo dos elementos de second-name iguais <template> <sort select="second-name"/> <sort select="first-name"/> </template> XSLT 41
Outras características da ordenação O elemento sort possui atributos opcionais que podem ser utilizados o atributo order especifica a ordem: ascending (o default) ou descending o atributo lang especifica a língua utilizada no texto o atributo data-type especifica o tipo: text (o default) ou number para ordenar valores numéricos o atributo case-order XSLT 42
Numeração automática O elemento number é utilizado para numerar os elementos em uma lista de elementos facilita a manutenção da lista de ítens Exemplo: insere o número de seqüência antes do conteúdo do elemento <template match="item"> <number/><apply-templates/> </template> A numeração recomeça em cada elemento item XSLT 43
Numeração automática (cont.) O atributo level do elemento number possibilita diferentes formas de numeração level="single" a numeração recomeça em cada elemento pai level="any" a numeração continua em uma única seqüência level="multiple" possibilita numeração em múltiplos níveis XSLT 44
Numeração em níveis O número inserido consiste de várias partes o atributo format indica o tipo de numeração utilizado em cada nível e a pontuação entre os níveis o atributo count indica os elementos considerados na numeração de múltiplos níveis XSLT 45
Exemplo: numeração em níveis Numerar o título da seção (com uma letra) incluindo o número do capítulo Documento de entrada... <chapter> <section> <title>primeira seção do capítulo um</title>... XSLT 46
Exemplo: numeração em níveis (cont.) <template match="section/title"> <number level="multiple" count="chapter section" format="1.a"/> <apply-templates/> </template> Saída... 1.A Primeira seção do capítulo um 2.C Terceira seção do capítulo dois XSLT 47
Modos O atributo mode do elemento template é utilizado para definir vários templates associados a um elemento utilidade quando um elemento é formatado de diferentes formas segundo o caso Exemplo: títulos de capítulos... os títulos de capítulos são transformados em elementos H1 HTML por default, mas os títulos de capítulos são transformados em elementos H3 HTML quando reusados na introdução XSLT 48
Exemplo: modos <template match="intro"> <apply-templates select="//chapter/title" mode="toc"/> </template> <template match="chapter/title"> <html:h1><apply-templates/></html:h1> </template> <template match="chapter/title" mode="toc"> <html:h3><apply-templates/></html:h3> </template> XSLT 49
Variáveis O elemento variable é utilizado para declarar uma variável o atributo name indica o nome da variável o conteúdo do elemento corresponde ao valor da variável Utilidade para evitar redundância na geração de saída idêntica Exemplo: <variable name="colour">green</variable> XSLT 50
Usando variáveis O atributo select do elemento value-of é utilizado para recuperar o valor da variável o valor do atributo é uma referência a uma variável (identificada pelo símbolo $ ) Exemplo: <html:h1>a cor é <xsl:value-of select="$colour"/>.</html:h1> A cor é green XSLT 51
Usando variáveis em elementos de saída É possível expressar o valor de um atributo utilizando uma variável previamente definida chaves são utilizadas representando uma expressão de texto Exemplo: <variable name= border >3pt</variable>...... <fo:block border-width= {$border} >... XSLT 52
Reusando templates O elemento call-templates é utilizado para invocar um template utilidade para reusar a mesma formatação en vários lugares Funcionamento: 1. o template com a formatação comum é nomeado 2. o template é invocado através do elemento call-template XSLT 53
Exemplo: nomeando um template O atributo name do elemento template é utilizado para associar um nome único ao template <template name="createheader"> <html:hr/> <html:h2>**** <apply-templates/> ****</html:h2> <html:hr/> </template> XSLT 54
Exemplo (cont.): invocando um template O atributo name do elemento call-template é utilizado para invocar o template <template match="title"> <call-template name="createheader"/> </template> <template match="head"> <call-template name="createheader"/> </template> XSLT 55
Definindo parâmetros É possível passar parâmetros a um template utilizade para alterar o funcionamento do template chamado O elemento param é utilizado para definir uma variável o atributo name associa um nome à variável o conteúdo do elemento indica o valor default da variável XSLT 56
Exemplo: definindo parâmetros Exemplo: define uma variável de nome Prefix e valor default *** <template name="createheader"> <param name="prefix">***</param> <html:hr/> <html:h2> <value-of select="$prefix">estrelas! <apply-templates/> </html:h2> <html:hr/> </template> XSLT 57
Invocando um template com parâmetros O elemento with-param é utilizado para passar parâmetros quando um template é invocado Exemplo: o valor passado como parâmetro sobrescreve o valor default da variável <call-template name="createheader"> <with-param name="prefix">*****</param> </call-template> *****estrelas!... XSLT 58
Inserindo o valor de um atributo em um atributo de saída O prefixo @ representa o valor de um atributo Exemplo: insere os valores de dois atributos no atributo de saída name <full-name first="joão" second="silva"/> <template match="full-name"> <X:person name="{@first} {@second}"/> </template> <person name="joão Silva"/> XSLT 59
Inserindo o valor de um atributo no conteúdo de um elemento O elemento value-of insere o valor de um atributo no conteúdo de saída o prefixo @ é utilizado <template match="full-name"> <X:person> <value-of select="@first"/> <value-of select="@second"/> - <apply-templates/> </X:person> </template> XSLT 60
Inserindo o valor de um atributo no conteúdo de um elemento (cont.) Exemplo: insere os valores de dois atributos no conteúdo do elemento person entrada... <full-name first="joão" second="silva"/> saída... <person>joão Silva -... </person> XSLT 61
Criando elementos É possível criar elementos no documento de saída inserindo conteúdo nos templates Exemplo: cria o elemento html:h3 quando encontrado um elemento third-header-level no documento de entrada <template match="third-header-level"> <html:h3> <apply-templates/> </html:h3> </template> XSLT 62
Criando elementos (cont.) O elemento element também pode ser utilizado o atributo name indica o nome do elemento o atributo opcional namespace indica o namespace do elemento Exemplo: equivalente ao exemplo anterior <template match="third-header-level"> <element namespace="html" name="h3"> <apply=templates/> </element> </template> XSLT 63
Copiando elementos O elemento copy é utilizado para criar elementos no documento de saída copiando elementos do documento de entrada Exemplo: agrega um prefixo a todos os cabeçalhos HTML <template match="h1 h2 h3 h4 h5 h6 h7"> <copy> Header: <apply-templates/> </copy> </template> Os atributos do elemento de entrada não são copiados XSLT 64
Criando atributos O elemento attribute é utilizado para criar atributos em um elemento de saída o atributo name indica o nome do atributo criado o atributo namespace indica o namespace do aributo criado o conteúdo do elemento representa o valor do atributo Pode ser utilizado com o elemento element ou com o elemento copy XSLT 65
Exemplo: criando atributos Exemplo: adiciona o atributo style <template match="h1 h2 h3 h4 h5 h6 h7"> <copy> <attribute name="style">color: red</attribute> Header: <apply-templates/> </copy> </template> XSLT 66
Exemplos: Documento XML de entrada <listalivros> <livro> <titulo>projeto de Banco de Dados</titulo> <autor>heuser, Carlos Alberto</autor> <ano>1999</ano> </livro> <livro> <titulo>data on the Web</titulo> <autor>abiteboul, Serge</autor> <ano>2000</ano> </livro> </listalivros> XSLT 67
Exemplo 1 - stylesheet para HTML <xsl:template match="listalivros"> <html> <xsl:apply-templates/> </html> </xsl:template> <xsl:template match="livro"> <P> <xsl:apply-templates/> </P> </xsl:template>...... XSLT 68
Exemplo 1 - documento HTML gerado <html> <P> Projeto de Banco de Dados Heuser, Carlos Alberto 1999 </P> <P> Data on the Web Abiteboul, Serge 2000 </P> </html> XSLT 69
Exemplo 2 - stylesheet para uma representação XML diferente <xsl:template match="listalivros"> <BookList> <xsl:apply-templates/> </BookList> </xsl:template> <xsl:template match="livro"> <Book> <xsl:apply-templates/> </Book> </xsl:template>...... XSLT 70
Exemplo 2 - stylesheet para uma representação XML diferente (cont.) <xsl:template match="autor"> <Author> <xsl:value-of select="."/> </Author> </xsl:template> <xsl:template match="titulo"> <Title> <xsl:value-of select="."/> </Title> </xsl:template> XSLT 71
Exemplo 2 - documento XML gerado <BookList> <Book> <Author>Heuser, Carlos Alberto</Author> <Title>Projeto de Banco de Dados</Title> <Year>1999</Year> </Book> <Book> <Author>Abiteboul, Serge</Author> <Title>Data on the Web</Title> <Year>2000</Year> </Book> </BookList> XSLT 72
Referências Bradley, N. The XML Companion, Second edition. Ed. Addison-Wesley. 2000. Clark, J. "XML Bible: XSL Transformations", Cap. 14. Ed. Elliotte Rusty Harold, 1999. http://metalab.unc.edu/xml/books/bible/updates/14 XSLT 73