You are on page 1of 74

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

TeX. criar. etc. HTML.) – especificar os objetos de formatação XSL que são aplicados a cada classe de elementos 3 –XSLT– . reestruturar e ordenar elementos reusar elementos em qualquer parte do documento transformar dados de um formato XML para outro formato baseado em texto (XML.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.

.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 WARNING 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 .

assim como também <kw>CSS</kw> é introduzido. lista de figuras. etc.</review> </book>   A seguinte saída pode ser gerada no documento de saída: KEYWORDS: XML. CSS   Utilidade para construir tabelas de conteúdo. XSL. –XSLT– 9 .Exemplo: localizando e reusando informação <book> <review>Este livro trata de <kw>XML</kw> e <kw>XSL</kw>.

Gerando código HTML   Um style sheet pode transformar dados XML em sintaxe HTML   Exemplo: os parágrafos são transformados para o elemento <P> em HTML <template match="para"> <html:p><apply-templates/></html:p> </template> –XSLT– 10 .

for-each.w3. value-of. etc.Style sheet XSLT   Um style sheet XSLT é identificado pelo namespace: http://www.   Um style sheet é um documento XML bem formado –XSLT– 11 .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.

w3.org/XSL/Transform/1.0"> ..Estrutura geral   O elemento raiz é denominado stylesheet   O resto dos elementos definidos no padrão formam parte do namespace. . . </stylesheet>   O elemento transform pode ser utilizado no lugar do stylesheet 12 –XSLT– . <stylesheet xmlns="http://www..

... </X:meu-elemento> </stylesheet> –XSLT– 13 ... <X:meu-elemento> ... .."> .0"> xmlns:X="....org/XSL/Transform/1. .w3.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...

" result-ns="X"> –XSLT– 14 .org/XSL/Transform/1..w3. .0"> xmlns:X="... ...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..

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. </X:book> –XSLT– 16 . </stylesheet> .)   Exemplo: <?xml-stylesheet type="#MyStyles" ?> <X:book> <stylesheet id="MyStyles" ..

</para> Os espaços brancos são preservados por default –XSLT– 17 .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> </book>   <para>Um parágrafo.

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 .

indent-result="yes"> –XSLT– 19 ...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 .

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> –XSLT– 22 .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– 23 ...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"> .

xsl"> <import href="colours.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 . –XSLT– 24 .xsl"> <template .... > <import href="tables..

.. ">   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.Inserindo definições   O elemento include é utilizado para inserir regras definidas em outros style sheets <include href=" . o elemento import somente antes da primeira regra template –XSLT– 25 .

etc.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.   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 28 –XSLT– .

)   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 .Regras default (cont.

” o elemento corrente “value-of” insere o valor do elemento selecionado –XSLT– 30 ."/> </template> “text()” representa um string de texto “.Regra defaut text()   Apresenta o conteúdo texto de cada elemento   Exemplo: <template match="text()"> <value-of select=".

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 31 –XSLT– .

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

.. </body> –XSLT– 36 .)   Saída gerada no exemplo anterior <?ACME INSERT_TOC?> <!--Esta é a versão HTML--> <body> .Inserindo comentários e instruções de processamento (cont.

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 .

</item> <item sortcode="M"> .. </item> </list> <sort select="@sortcode"/> –XSLT– 40 ...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"> ..

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 43 –XSLT– .

)   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 automática (cont.

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 .

<chapter> <section> <title>Primeira seção do capítulo um</title> . –XSLT– 46 .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... . .

.) <template match="section/title"> <number level="multiple" count="chapter|section" format="1. 1.Exemplo: numeração em níveis (cont.A Primeira seção do capítulo um 2.A"/> <apply-templates/> </template>   Saída. .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. mas – os títulos de capítulos são transformados em elementos H3 HTML quando reusados na introdução –XSLT– 48 . – os títulos de capítulos são transformados em elementos H1 HTML por default.

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 .

. –XSLT– 52 .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}”> .. .

o template com a formatação comum é nomeado 2. o template é invocado através do elemento call-template –XSLT– 53 .Reusando templates   O elemento call-templates é utilizado para invocar um template – utilidade para reusar a mesma formatação en vários lugares   Funcionamento: 1.

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 .

. –XSLT– 58 ..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! .

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 .

.. <full-name first="João" second="Silva"/> – saída. . <person>João Silva ... .)   Exemplo: insere os valores de dois atributos no conteúdo do elemento person – entrada. </person> –XSLT– 61 .Inserindo o valor de um atributo no conteúdo de um elemento (cont. .

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 64 –XSLT– .

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 ... ..

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 1 .

.....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> .Exemplo 2 . –XSLT– 70 .

"/> </Author> </xsl:template> <xsl:template match="titulo"> <Title> <xsl:value-of select="."/> </Title> </xsl:template> –XSLT– 71 .stylesheet para uma representação XML diferente (cont.Exemplo 2 .) <xsl:template match="autor"> <Author> <xsl:value-of select=".

Exemplo 2 . Serge</Author> <Title>Data on the Web</Title> <Year>2000</Year> </Book> </BookList> –XSLT– 72 . Carlos Alberto</Author> <Title>Projeto de Banco de Dados</Title> <Year>1999</Year> </Book> <Book> <Author>Abiteboul.documento XML gerado <BookList> <Book> <Author>Heuser.

Ed. N. Addison-Wesley. "XML Bible: XSL Transformations". Elliotte Rusty Harold. 1999. “The XML Companion”. Second edition. Ed. 2000.   Clark. Cap.unc. 14.Referências   Bradley.edu/xml/books/bible/updates/14 –XSLT– 73 . J. http://metalab.