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 D o cu m e n to d e e n tra d a X S L T P ro ce sso r XML D o cu m e n to d e sa íd a XML PDF XHTM L ... XSLT te m p la te s X S L T style sh e e t 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> Documento <AUTHORS> catalog.xsl <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> 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> Discover Java <author> <author> Ed Tittel Bill Brogden output <publisher> <ISBN> <price> <pubdate> id=”12" 0-7645-8024-8 IDG Books Worldwide 24.99 1997 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> </xsl:template> <xsl:template match="book" > <title_publisher> <xsl:value-of select="title" /> , <xsl:value-of select="publisher" /> </title_publisher> </xsl:template> </xsl:stylesheet> output catalog.xml Root (/) <catalog> <book> <book> 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. Expressão XPath <xsl:template match="/catalog" > <books> <xsl:apply-templates select="book"/> </books> </xsl:template> 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> </xsl:template> Todo o texto que não faz parte do espaço de nomes xsl: fará parte do documento resultado. <title_publisher> … </title_publisher> Extracção de dados do documento de entrada 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 .. @ - modo de aceder a atributos @nomedoatributo * - representa qualquer nó // - representa o nó pai do nó corrente - 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 selecciona o elemento title do pai do pai do nó corrente //author 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> <title>XML to HTML</title> </head> <body> <xsl:apply-templates /> </body></html> </xsl:template> Elementos xsl <xsl:template match="book" > para extrair <h3><b>Título: informação <xsl:value-of select="title”/> </b></h3> <h5>Editora: <xsl:value-of select="publisher" /> </h5> </xsl:template> catalogtohtml 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:template> resultado </xsl:stylesheet> 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> </xsl:template> 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 “ >… exemplo catalogif.xsl xsl:choose (switch) <xsl:choose> <xsl:when test = boolean-expression> … </xsl:when> <xsl:otherwise> … </xsl:otherwise> </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:template> 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/> </xsl:template> Template por omissão para nós texto e atributo: <xsl:template match="text()|@*"> <xsl:value-of select="."/> </xsl:template> exemplo minimal.xsl Nova estrutura XML Criar um novo documento xml com outra estrutura autores autor nome obra “isbn” autor ... exemplo novaestrutura.xsl <xsl:template match="/" > <autores> <xsl:apply-templates select="//author" > <xsl:sort select="." /> </xsl:apply-templates> </autores> </xsl:template> <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> </xsl:template>...