XSL (EXtensible Stylesheet Language) é uma família de linguagens para forma- tação de documentos XML. XSL é utilizada para criar estilos (stylesheets) para documen- tos XML da mesma forma que CSS (Cascading Style Sheets) cria estilos para documentos HTML. Com XSL é possível converter um documento XML descrito por um determinado DTD ou Schema XML em outro documento XML descrito por um DTD ou Schema XML diferente. Isto é bastante útil para serviços Web, pois um determinado serviço Web pode utilizar uma formatação das mensagens SOAP diferente daquela que o requisitante está apto a trabalhar. XSL pode também filtrar ou ordenar os elementos de um documento XML. XSL é dividida em três partes:
XSL Transformation (XSLT) uma linguagem XML para transformação de documentos XML.
XML Path Language (XPath) uma linguagem não XML usada pela XSLT para navegar sobre partes de documentos XML.
XSL Formatting Objects (XSL-FO) uma linguagem para especificação da formatação visual de documentos XML.
XSLT é uma linguagem declarativa que cria stylesheets para transformação de documentos XML. Um stylesheet contém um conjunto de templates e expressões. Um template descreve a saída a ser gerada baseada em certos critérios. Uma expressão determina em qual elemento XML deve ser aplicada a transformação. O princípio de funcionamento do XSLT é bastante simples, conforme podemos observar na Figura A.1. Processadores XSLT recebem como entrada documentos XML e stylesheets XSLT para então produzir um novo documento XML baseado nas regras de templates definidas no stylesheet XSLT. O documento original não é modificado, mas o novo documento pode ser criado com sintaxe XML ou qualquer outro formato, tal como HTML ou SQL.
XSLT utiliza um poderoso mecanismo de casamento de padrões para selecionar pedaços dos documentos XML para transformação. As regras de templates dos stylesheets XSLT são definidas para serem aplicadas em padrões, que podem ser elementos ou atributos XML. Os padrões são definidos utilizando a linguagem XPath.
Apêndice A 119
Figura A.1: Transformação em XSLT
O processador XSLT constrói representações em árvore para o documento XML de entrada e o documento de saída. O processador XSLT começa o processamento da representação em árvore do documento XML a partir do elemento root, procurando no stylesheet XSLT se existe algum casamento para este nó, se existir o casamento ele verifica o template que deve ser aplicado. Os templates definidos no XSLT direcionam o processador para criar novos nós na árvore de saída ou então processar outros nós da árvore do documento XML da mesma forma que o nó root. Ao final do processamento a árvore de saída estará montada e o documento de saída será derivado a partir dela.
Uma característica interessante do XSLT é que ele pode ser especificado dentro do documento XML ao qual ele será aplicado. Para adicionar o XSLT stylesheet no documento XML basta inserir a seguinte instrução após a declaração XML:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
XSLT utiliza várias declarações de elementos e funções pré-estabelecidas para criar os stylesheets. O poder de expressão das declarações e a vasta quantidade de funções tornam esta linguagem bastante poderosa. O propósito deste documento não é apresenta toda a linguagem XSLT, apenas estamos interessados em demonstrar sua funcionalidade e os principais elementos e funções. Uma referência completa para XSLT pode ser obtida em [w3c, 1999].
Para efeito de exemplificação considere a mensagem SOAP representada no trecho de Código A.1. Uma mensagem SOAP é um documento XML, portanto XSLT pode ser utilizado para transformá-la em outro documento.
Apêndice A 120
Código A.1 Mensagem SOAP
1 <?xml version=’1.0’ encoding=’utf-8’?> 2 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 3 <soapenv:Body> 4 <ns:subscribeBurdenAssyncServiceResponse xmlns:ns="http://service/xsd"> 5 <ns:return xmlns:ax29="http://model/xsd" 6 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 7 xsi:type="ax29:Regime"> 8 <ax29:burden>0</ax29:burden> 9 <ax29:cpm xsi:nil="true" /> 10 <ax29:idRegime xsi:nil="true" /> 11 <ax29:stemSize xsi:nil="true" /> 12 </ns:return> 13 </ns:subscribeBurdenAssyncServiceResponse> 14 </soapenv:Body> 15 </soapenv:Envelope>
A mensagem SOAP representa o retorno de um serviço Web. O conteúdo desta mensagem que é interpretado pela aplicação está dentro do elemento ns:subscribeBurdenAssyncService.
O Código A.2 ilustra o documento XLST definido para transformar a mensagem SOAP em outro documento XML.
Apêndice A 121
Código A.2 XSLT para a mensagem SOAP
1 <xsl:stylesheet version="1.0" 2 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:tns1="http://service/xsd" 5 xmlns:tns2="http://model/xsd"> 6 <xsl:template match="/"> 7 <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 8 xmlns:j.0="http://www.example.org/owls/OilMonitor.owl#"> 9 <xsl:variable name="x" select="tns1:return" />
10 <xsl:element name="j.0:Regime"> 11 <xsl:element name="j.0:idRegime"> 12 <xsl:attribute name="rdf:datatype"> 13 http://www.w3.org/2001/XMLSchema#string</xsl:attribute> 14 <xsl:value-of select="$x/tns2:idRegime" /> 15 </xsl:element> 16 <xsl:element name="j.0:burdenValue"> 17 <xsl:attribute name="rdf:datatype"> 18 http://www.w3.org/2001/XMLSchema#string</xsl:attribute> 19 <xsl:value-of select="$x/tns2:burden" /> 20 </xsl:element> 21 <xsl:element name="j.0:cpmValue"> 22 <xsl:attribute name="rdf:datatype"> 23 http://www.w3.org/2001/XMLSchema#string</xsl:attribute> 24 <xsl:value-of select="$x/tns2:cpm" /> 25 </xsl:element> 26 <xsl:element name="j.0:stemSize"> 27 <xsl:attribute name="rdf:datatype"> 28 http://www.w3.org/2001/XMLSchema#string</xsl:attribute> 29 <xsl:value-of select="$x/tns2:stemSize" /> 30 </xsl:element> 31 </xsl:element> 32 </rdf:RDF> 33 </xsl:template> 34 </xsl:stylesheet>
No documento XSLT a declaração <xsl:template match="/» instrui o processador XSLT a executar este template no elemento root da árvore do documento XML. O texto que precede a declaração do template:
Apêndice A 122
xmlns:j.0="http://www.example.org/owls/OilMonitor.owl#">
será automaticamente colocada no documento de saída. Este texto não é uma declaração XSLT, pois não tem o prefixo xsl. A declaração seguinte, <xsl:variable/> define uma variável identificada por x com o valor "tns1:return". Esta variável será utilizada no restante do documento XSLT para referenciar seu valor com a seguinte sintaxe: $x. Prosseguindo com a análise, a declaração <xsl:element> define um elemento XML para o documento de saída. O primeiro elemento definido tem o nome j.0:idRegime e possui um atributo chamado rdf:datatype com o valor especificado pelo texto
http://www.w3.org/2001/XMLSchema#string
O valor deste elemento é o mesmo valor do elemento "$x/tns2:idRegime"do documento de entrada. A expressão "$x/tns2:idRegime"é uma expressão XPath, onde / é um seletor para subdiretórios. Desta forma esta expressão representa o elemento idRegime que é de- finido no namespace tns2 que, por sua vez está definido dentro do namespace identificado pela variável $x. Conforme podemos observar no Código A.1 o elemento ns:return está definido dentro do namespace "http://service/xsd"que é o valor da variável x. As outras declarações XSLT especificam mais três elementos, burdenValue, burdenValue e stem- Size. Dessa forma o documento XML criado a partir das transformações XSLT terá a seguinte forma, ilustrado no Código A.3:
Código A.3 Documento
1 <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 2 xmlns:j.0="http://www.example.org/owls/OilMonitor.owl#"> 3 <j.0:Regime> 4 <j.0:idRegime rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> 5 </j.0:idRegime> 6 <j.0:burdenValue rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> 7 0</j.0:burdenValue> 8 <j.0:cpmValue rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> 9 </j.0:cpmValue> 10 <j.0:stemSize rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> 11 </j.0:stemSize> 12 </j.0:Regime> 13 </rdf:RDF>