Tecnologias XML Extensible Stylesheet Language Transformation - XSLT
XSLT XSL - Extensible Stylesheet Language Linguagem para transformação e formatação de um documento XML XSL deu origem a 3 normas: XPath que define um modo de navegação e localização da informação num documento XML. XSL-FO ( Formating Objects) que especifica a formatação dos documentos. XSLT (Transformation) que especifica transformações sobre um documento XML
XSLT XSLT Transformações sobre um documento XML Documento de entrada XSLT Processor Documento de saída XML XML PDF XHTML... XSLT templates XSLT stylesheet
Referenciar uma folha de estilos XSLT num XML <?XML VERSION="1.0" ENCODING="ISO-8859-1"?> <?XML-STYLESHEET TYPE="TEXT/XSL" HREF="CATALOG.XSL"?> <CATALOG> <BOOK ID="12"> <TITLE>DISCOVER JAVA</TITLE> <AUTHORS> <AUTHOR>ED TITTEL</AUTHOR> <AUTHOR>BILL BROGDEN</AUTHOR> </AUTHORS> <PUBLISHER>IDG BOOKS WORLDWIDE</PUBLISHER> <ISBN>0-7645-8024-8</ISBN> <PRICE>24.99</PRICE> <PUBDATE>1997</PUBDATE> </BOOK> <BOOK ID="23"> </BOOK> </CATALOG> Documento catalog.xsl
Um processador XSLT trabalha sobre uma representação em árvore da estrutura hierárquica de um documento XML Root (/) <?xml-stylesheet type="text/xsl" href="temp.xsl"?> <catalog> <book> <book>... <title> <Authors> <publisher> <ISBN> <price> <pubdate> id= 12" Discover Java <author> Ed Tittel <author> Bill Brogden IDG Books Worldwide 0-7645-8024-8 24.99 1997 output
Exemplo de uma folha de estilos <?xml version="1.0" encoding="iso-8859-1"?> <xsl:stylesheet version="1.0 xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:template match="/catalog" > <books> <xsl:apply-templates select="book"/> </books> Root (/) <catalog> <xsl:template match="book" > <title_publisher> <xsl:value-of select="title" />, <xsl:value-of select="publisher" /> </title_publisher> </xsl:stylesheet> <book> <book> output catalog.xml catalog.xsl
XSLT Uma folha de estilo XSLT consiste numa série de templates que, conjuntamente com expressões baseadas em XPath, determinam como o processador vai aplicá-las aos nós do documento fonte. Para cada template, o processador procura no documento o nó que verifica o padrão definido e aplica as acções definidas nesse template Os templates são instanciados para todos os nós onde é efectuado o match
Análise da folha catalog.xsl Os documentos XSLT são documentos XML <?xml version="1.0" encoding="iso-8859-1"?> A raíz do documento é o elemento xsl:stylesheet <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> xsl:template inicia um template com um atributo match que indica os nós a que deve ser aplicado. <xsl:template match="/catalog" > <books> <xsl:apply-templates select="book"/> </books> Expressão XPath
Análise da folha catalog.xsl O elemento xsl:apply-templates faz chamada aos outros templates <xsl:apply-templates select="book"/> <xsl:template match="book" > <title_publisher> <xsl:value-of select="title" />, <xsl:value-of select="publisher" /> </title_publisher> Extracção de dados do documento de entrada Todo o texto que não faz parte do espaço de nomes xsl: fará parte do documento resultado. <title_publisher> </title_publisher> xsl:value-of extrai o texto de um nó seleccionado: <title> e <publisher>
Navegação na árvore - XPath O XSLT usa expressões XPath para localizar nós na árvore do documento de entrada Expressões XPath são usadas nos atributos select e match Semelhante à navegação numa árvore de directórios Caminhos absolutos e relativos Um caminho absoluto começa sempre pelo carácter '/', caso contrário são caminhos relativos ao nó corrente absoluto: /catalog/book/title relativo: authors/author
Navegação na árvore - XPath Selectores de nós: / - representa a raiz ou uma relação pai/filho. - representa o nó corrente.. - representa o nó pai do nó corrente @ - modo de aceder a atributos @nomedoatributo * - representa qualquer nó // - todos os nós descendentes de um nó ou no principio de um caminho todos os descendentes da raiz Exemplos de selecções de nós../../title //author @* selecciona o elemento title do pai do pai do nó corrente selecciona todos os nós author independentemente da sua posição na árvore selecciona todos os atributos no contexto actual. /catalog/book/@id seleciona o atributo id do nó book, filho de catalog debaixo da raiz../author selecciona todos os nós author filhos do nó corrente
Navegação na árvore - XPath Predicados (filtros) Os predicados são filtros para refinar a pesquisa Os predicados são escritos entre [ ] Exemplos: /book[@id] - selecciona o nó book se tiver um atributo id /catalog/book[2] - selecciona o segundo nó book Funções Xpath number position() devolve a posição do nó actual book[position()=1] number last() devolve o índice do ultimo nó no conjunto de nós. book[last()] number count(node-set) devolve o número de nós do conjunto de nós argumento <xsl:value-of select="count(authors/author)" />
Exemplo de transformação XML - HTML Anotação e Texto para o documento de saida exemplo... <xsl:template match="/catalog" > <html><head> <body> <title>xml to HTML</title> </head> <xsl:apply-templates /> </body></html> <xsl:template match="book" > <h3><b>título: <xsl:value-of select="title /> </b></h3> <h5>editora: <xsl:value-of select="publisher" /> </h5> catalogtohtml Elementos xsl para extrair informação
Elementos XSLT xsl:for-each define um template que vai ser aplicado a todos os nós seleccionados pela expressão do atributo select. <xsl:template match="/" > <html><body><table border="1"> <xsl:for-each select="catalog/book"> <tr><td> <xsl:value-of select="title" /> </td> <td> <xsl:for-each select="authors/author"> <br><xsl:value-of select="." /></br> </xsl:for-each></td> <td> <xsl:value-of select="publisher" /></td> <td> <xsl:value-of select="isbn" /></td> <td> <xsl:value-of select="price" /></td> <td> <xsl:value-of select="pubdate" /></td> </tr> </xsl:for-each> </table></body></html> </xsl:stylesheet> resultado catalogfor.xsl
Elementos XSLT xsl:sort A ordenação é especificada com elementos xsl:sort como filhos de elementos xsl:apply-templates ou xsl:for-each A chave de ordenação é especificada pelo atributo select Pode ser especificada mais de uma chave de ordenação usando vários xsl:sort. <xsl:template match="/" > <html><body><h3>lista de autores </h3> <xsl:for-each select="catalog/book/authors/author"> <xsl:sort data-type="text" order="ascending" /> <br><xsl:value-of select="." /></br> </xsl:for-each> </body></html> resultado catalogsort.xsl
Elementos XSLT xsl:if Instrução condicional O atributo test define a expressão a avaliar Não tem else <xsl:if test=" not(position()=last())" > <xsl:if test= price < < 20 > xsl:choose (switch) <xsl:choose> <xsl:when test = boolean-expression> </xsl:when> <xsl:otherwise> </xsl:otherwise> exemplo catalogif.xsl </xsl:choose> exemplo catalogchoose.xsl
Elementos XSLT xsl:element insere elementos na árvore resultado da transformação O nome do elemento é definido pelo atributo name <xsl:template match="/catalog" > <xsl:element name="books"> <xsl:apply-templates select="book"/> </xsl:element> xsl:attribute Insere atributos. O nome do atributo é definido pelo atributo name. O valor do atributo é determinado pelo conteúdo do template exemplo catalogelement.xsl
Elementos XSLT xsl:copy elemento para criar uma cópia do nó corrente não copia atributos, nem filhos xsl:copy-of copia tudo o que for seleccionado pelo atributo select <xsl:template match="book"> <xsl:copy-of select="."> </xsl:copy-of> exemplo catalogcopy.xsl
Templates por omissão Quando não existe nenhum template são aplicados templates por omissão. Template por omissão para nós elemento e raíz: <xsl:template match="* /"> <xsl:apply-templates/> Template por omissão para nós texto e atributo: <xsl:template match="text() @*"> <xsl:value-of select="."/> exemplo minimal.xsl
Nova estrutura XML Criar um novo documento xml com outra estrutura autores autor autor... exemplo nome obra isbn novaestrutura.xsl <xsl:template match="/" > <autores> <xsl:apply-templates select="//author" > <xsl:sort select="." /> </xsl:apply-templates> </autores> <xsl:template match="author" > <xsl:element name="autor"> <xsl:element name="nome"> <xsl:value-of select="." /> </xsl:element> <xsl:element name="obra"> <xsl:attribute name="isbn" > <xsl:value-of select="../../isbn" /> </xsl:attribute> <xsl:value-of select="../../title" /> </xsl:element> </xsl:element>...