você está aqui: Home  → Arquivo de Mensagens

Tutorial XSLT

Colaboração: Otávio Augusto Bizetto Penatti

Data de Publicação: 15 de Março de 2005

Este tutorial é uma tradução do tutorial de XSLT da W3Schools, disponível em http://www.w3schools.com/xsl/default.asp

Tutorial XSLT

Em nosso tutorial de XSLT você irá aprender o que é o XSLT. Você aprenderá como usar o XSLT para transformar documentos XML em outros formatos XML, como o XHTML.

Linguagens XSL

Começou com XSL e terminou com XSLT, XPath and XSL-FO.

Começou com XSL

XSL é abreviação de eXtensible Stylesheet Language (Linguagem de Folha de Estilos Extensível).

O World Wide Web Consortium (W3C) começou a desenvolver o XSL porque havia uma necessidade linguagem de filha de estilos baseada em XML.

CSS - Folhas de Estilo para HTML

HTML usa tags predefinidas e os significados das tags são "entendíveis".

O elemento <table> define uma tabela e o browser sabe como mostrá-la.

Adicionar estilos à elementos HTML também é simples. Dizer para um browser para mostrar um elemento com uma certa fonte ou cor é fácilmente feito com CSS.

XSL - Folhas de Estilo para XML

XML não usa tags predefinidas (as tags podem ser ao "gosto do freguês") e os significados dessas tags são não "interpretáveis".

A tag <table> pode significar uma tabela HTML ou um móvel, e o browser não sabe como mostrá-la.

Deve haver algo então, que adicionado ao documento XML, descreve como o documento deve ser mostrado; e isso é o XSL!

XSL - Mais que uma linguagem de folhas de estilos

XSL consiste de 3 partes:

  • XSLT é uma linguagem para transformar documentos XML
  • XPath é uma linguagem para definir partes de um documento XML
  • XSL-FO é uma linguagem para formatar documentos XML

Pense em XSL como um conjunto de linguagens que podem transformar XML em XHTML, filtrar e ordenar dados XML, definir partes de um documento XML, formatar dados XML baseados nos valores dos dados, como mostrar valores negativos em vermelho, e exportar dados XML para mídias diferentes, como telas, papel ou voz.

Este tutorial é sobre XSLT

O resto do tutorial é sobre XSLT - a linguagem para transformar documentos XML.

Mas você também pode estudar nosso Tutorial XPath (em inglês ou português), Tutorial XSL-FO, W3C XSL activities

Introdução ao XSLT

XSLT é uma linguagem para transformar documentos XML em outros documentos XML.

XPath é uma linguagem para definir partes de um documento XML.

O que você já deve saber

Antes de estudar XSLT você deve saber o básico de XML e XML Namespaces.

Se você quer estudar esses assuntos antes, por favor leia nosso Tutorial XML.

XSLT - Transformações XSL

XSLT é a parte mais importante dos padrões XSL. Ele é a parte do XSL usada para transformar um documento XML em outro documento XML, ou um outro tipo de documento que é reconhecido por um browser, como HTML e XHTML. Normalmente XSLT faz isso transformando cada elemento XML em um elemento (X)HTML.

XSLT também pode adicionar novos elementos no arquivo de saída, ou remover elementos. Ele pode rearranjar e ordenar elementos, testar e tomar decisões sobre quais elementos mostrar, e muito mais.

Um modo comum de descrever o processo de transformação é dizer que o XSLT transforma uma árvore de origem XML em uma árvore de resultado XML.

XSLT usa XPath

XSLT usa o XPath para definir os padrões combinantes para as transformações.

Se você quiser estudar XPath primeiro, por favor leia o nosso Tutorial de XPath.

Como ele trabalha?

No processo de transformação, XSLT usa XPath para definir partes do documento de origem que combinam com um ou mais moldes. Quando uma combinação é encontrada, XSLT transformará a parte combinante do documento de origem no documento de resultado. As partes do documento de origem que não combinam com um molde permanecerão sem modificações no documento de resultado.

XSLT é um padrão Web

XSLT tornou-se uma Recomendação W3C em 16 de Novembro de 1999.

Para ler mais sobre as atividades XSLT na W3C por favor leia o nosso Tutorial W3C

Browsers XSLT

Não são todos os browsers de Internet que têm suporte completo ao XSLT.

Internet Explorer 5 não é bom

XSLT no Internet Explorer 5 NÃO é compatível com a Recomendação Oficial W3C XSL.

Quando o Internet Explorer 5 foi liberado em Março de 1999, o padrão XSLT ainda era um rascunho da W3C.

Como a Recomendação final W3C XSL é diferente do rascunho, o suporte para XSL no IE 5 não é 100% compatível com a Recomendação Oficial XSLT.

Esta restrição aplica-se para ambos IE 5 e IE 5.5.

Internet Explorer 6 é melhor

Internet Explorer 6 tem suporte completo à Recomendação Oficial W3C XSLT.

O XML Parser 3.0 - lançado com o Internet Explorer 6 e o Windows XP - é baseado em ambas Recomendações W3C XSLT 1.0 e W3C XPath 1.0.

Se você realmente quer aprender XSLT você deve atualizar para o Internet Explorer 6.0.

Netscape 6

Netscape 6 não suporta completamente a Recomendação Oficial W3C XSLT. Contudo, a maioria dos exemplos nesse tutorial também funcionarão no Netscape 6.

Netscape 7

Netscape 7 suporta a Recomendação Oficial W3C XSLT.

Internet Explorer MSXML Parser

MSXML Parser 2.0 é o XML Parser que foi lançado com o IE 5.

MSXML Parser 2.5 é o XML Parser que foi lançado com o Windows 2000 e o IE 5.5.

MSXML Parser 3.0 é o XML Parser que foi lançado com o IE 6 e o Windows XP.

Segundo a Microsoft, o MSXML Parser 3.0 é 100% compatível com a Recomendação Oficial W3C XSLT: "MSXML 3.0 oferece um avanço significativo sobre o MSXML 2.5: acesso HTTP server-safe, implementação completa do XSLT e XPath, mudanças no SAX (Simple API for XML), maior adaptação com os padrões W3C, e vários bugs corrigidos."

Para mais informações: http://msdn.microsoft.com/xml/general/xmlparser.asp

Você pode ler mais sobre as últimas releases do IE na nossa Seção de Browsers.

XSLT - Transformações

Exemplo de estudo: Como transformar XML em XHTML usando XSLT.

Os detalhes deste exemplo serão explicados no próximo capítulo.

Declaração Correta da Folha de Estilos

O elemento raiz que declara o documento a ser uma folha de estilos XSL é <xsl:stylesheet> ou <xsl:transform>.

Nota: <xsl:stylesheet> e <xsl:transform> são completamente sinônimos e um ou outro pode ser usado!

A maneira correta de declarar uma folha de estilos XSL de acordo com a Recomendação W3C XSLT é:

  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

ou:

  <xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

Nota: O xmlns:xsl="http://www.w3.org/1999/XSL/Transform" identifica a Recomendação Namespace oficial W3C XSL. Se você usa este namespace, você também deve incluir o atributo version="1.0".

Nota: Se você está usando o IE 6 ou o Netscape 6 você deve usar um dos códigos acima.

Declaração Incorreta da Folha de Estilos

Essa foi a maneira correta de declarar uma folha de estilos XSL de acordo com o rascunho W3C XSL:

  <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">

Nota: A declaração acima é ANTIGA, mas se você estiver usando o IE 5 você poderá usar o código (incorreto) acima.

Comece com o seu documento XML

Nós queremos transformar o seguinte documento XML ("cdcatalog.xml") em XHTML:

  <?xml version="1.0" encoding="ISO-8859-1"?>
  <catalog>
    <cd>
      <title>Empire Burlesque</title>
      <artist>Bob Dylan</artist>
      <country>USA</country>
      <company>Columbia</company>
      <price>10.90</price>
      <year>1985</year>
    </cd>
  .
  .
  .
  </catalog>

Para visualizar um documento XML/XSL no IE 5 (ou mais novo) e Netscape 7 você pode clicar em um link, digitar a URL na barra de endereços ou dar um duplo clique no nome de um arquivo XML em uma pasta de arquivos.

Para visualizar um documento XML/XSL no Netscape 6 você terá que abrir o arquivo XML e então clicar com o botão direito do mouse e escolher "View Page Source".

Ver arquivo XML

Crie uma folha de estilos XSL

Então você cria uma folha de estilos XSL ("cdcatalog.xsl") com um molde de tranformação:

  <?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="/">
    <html>
  	<body>
  	  <h2>My CD Collection</h2>
  	  <table border="1">
  		<tr bgcolor="#9acd32">
  		  <th align="left">Title</th>
  		  <th align="left">Artist</th>
      	</tr>
  		<xsl:for-each select="catalog/cd">
  		<tr>
  		  <td><xsl:value-of select="title"/></td>
  		  <td><xsl:value-of select="artist"/></td>
  		</tr>
  		</xsl:for-each>
  	  </table>
  	</body>
    </html>
  </xsl:template>
  
  </xsl:stylesheet>

Ver arquivo XSL

Junte a folha de estilos XSL ao documento XML

Finalmente, adicione uma referência à folha de estilos XSL em seu documento XML ("cdcatalog.xml"):

  <?xml version="1.0" encoding="ISO-8859-1"?>
  <?xml-stylesheet type="text/xsl" href="cdcatalog.xsl"?>
  <catalog>
    <cd>
      <title>Empire Burlesque</title>
      <artist>Bob Dylan</artist>
      <country>USA</country>
      <company>Columbia</company>
      <price>10.90</price>
      <year>1985</year>
    </cd>
  .
  .
  .
  </catalog>

Se você tiver um browser complacente com XSLT ele transformará bem seu XML em XHTML!

Veja o resultado no IE 6 ou Netscape 6 e 7

Veja o resultado no IE 5

Exemplo explicado

Os detalhes do exemplo acima serão explicados nos próximos capítulos!

O elemento <xsl:template>

Uma folha de estilos XSL consiste de um conjunto de regras chamados moldes (templates).

Cada elemento <xsl:template> contém regras para aplicar quando um nó específico é combinado.

XSLT usa Moldes

O elemento <xsl:template> contém regras a serem aplicadas quando um nó específico é combinado (matched).

O atributo match é usado para associar o molde com um elemento XML. O atributo match também pode ser usado para definir um molde para toda uma seção de um documento XML (por exemplo, match="/" define o documento todo).

A folha de estilos XSL a seguir contém um molde para emitir o Catálogo de CDs XML do capítulo anterior:

  <?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="/">
   <html>
   <body>
     <h2>My CD Collection</h2>
     <table border="1">
       <tr bgcolor="#9acd32">
         <th>Title</th>
         <th>Artist</th>
       </tr>
       <tr>
         <td>.</td>
         <td>.</td>
       </tr>
     </table>
   </body>
   </html>
  </xsl:template>
  
  </xsl:stylesheet>

Como a folha de estilos é também um documento XML, o documento começa com uma declaração xml: <?xml version="1.0" encoding="ISO-8859-1"?>.

A tag <xsl:stylesheet> define o início da folha de estilos.

A tag <xsl:template> define o início de um molde. O atributo match="/" associa (combina) o molde com a raiz (/) do documento XML de origem.

O resto do documento contém o molde propriamente dito, exceto pelas duas últimas linhas que definem o fim do molde e o fim da folha de estilos.

O resultado da transformação será como isso:

My CD Collection

Title Artist
. .

Se você tem o Netscape 6 ou IE 5 ou superior você pode ver: o arquivo XML, o arquivo XSL e o resultado.

O resultado desse exemplo foi um pouco decepcionante, porque nenhum dado foi copiado do documento XML para o resultado.

No próximo capítulo você aprenderá a usar o elemento <xsl:value-of> para selecionar o valor de um elemento XML.

O elemento <xsl:value-of>

O elemento <xsl:value-of> extrai o valor de um nó selecionado.

O elemento <xsl:value-of>

O elemento <xsl:value-of> pode ser usado para selecionar o valor de um elemento XML e adicioná-lo no resultado da transformação:

  <?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="/">
    <html>
      <body>
  	  <h2>My CD Collection</h2>
  	  <table border="1">
  	    <tr bgcolor="#9acd32">
  		  <th>Title</th>
  		  <th>Artist</th>
  		</tr>
  		<tr>
  		  <td><xsl:value-of select="catalog/cd/title"/></td>
  		  <td><xsl:value-of select="catalog/cd/artist"/></td>
  		</tr>
  	  </table>
  	</body>
    </html>
  </xsl:template>
  
  </xsl:stylesheet>

Nota: O valor do atributo select requerido contém uma expressão XPath. Ela funciona como a navegação num sistema de arquivos onde uma barra à frente (/) seleciona subdiretórios.

O resultado

O resultado da transformação será parecido com isso:

My CD Collection

Title Artist
Empire Burlesque Bob Dylan||

Se você tem o Netscape 6 ou IE 5 ou superior você pode ver o arquivo XML e o arquivo XSL.

Veja o resultado no IE6 ou Netscape 6 e 7

Veja o resultado no IE 5

O resultado desse exemplo também foi um pouco decepcionante, pois somente uma linha de dados foi copiada do documento XML para o resultado.

No próximo capítulo você aprenderá como usar o elemento <xsl:for-each> para selecionar valores de vários elementos XML, e adicioná-los ao resultado.

O elemento <xsl:for-each>

O elemento <xsl:for-each> permite a você fazer iterações (loops) em XSLT.

O elemento <xsl:for-each>

O elemento XSL <xsl:for-each> pode ser usado para selecionar todo elemento XML de um conjunto de nós específico :

  <?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="/">
    <html>
      <body>
  	  <h2>My CD Collection</h2>
        <table border="1">
          <tr bgcolor="#9acd32">
            <th>Title</th>
            <th>Artist</th>
          </tr>
  		<xsl:for-each select="catalog/cd">
  		  <tr>
  		    <td><xsl:value-of select="title"/></td>
  			<td><xsl:value-of select="artist"/></td>
  		  </tr>
  		</xsl:for-each>
  	  </table>
  	</body>
    </html>
  </xsl:template>
  
  </xsl:stylesheet>    

Nota: O valor do atributo select requerido contém uma expressão XPath. Ela funciona como a navegação num sistema de arquivos onde uma barra à frente (/) seleciona subdiretórios.

O resultado

O resultado da transformação será como esse:

My CD Collection

Title Artist
Empire Burlesque Bob Dylan
Hide your heart Bonnie Tyler
Greatest Hits Dolly Parton
Still got the blues Gary More
Eros Eros Ramazzotti
One night only Bee Gees
Sylvias Mother Dr.Hook
Maggie May Rod Stewart
Romanza Andréa Bocelli
When a man loves a woman Percy Sledge
Black angel Savage Rose
1999 Grammy Nominees Many
For the good times Kenny Rogers
Big Willie style Will Smith
Tupelo Honey Van Morrison
Soulsville Jorn Hoel
The very best of Cat Stevens
Stop Sam Brown
Bridge of Spies T`Pau
Private Dancer Tina Turner
Midt om natten Kim Larsen
Pavarotti Gala Concert Luciano Pavarotti
The dock of the bay Otis Redding
Picture book Simply Red
Red The Communards
Unchain my heart Joe Cocker

Se você tem o Netscape 6 ou IE 5 ou superior você pode ver o arquivo XML e o arquivo XSL.

Veja o resultado com o Netscape 6 ou IE 6

Veja o resultado com o IE 5

Filtrando a saída

Nós podemos filtrar a saída de um arquivo XML adicionando um critério ao atributo select de um elemento <xsl:for-each>.

<xsl:for-each select="catalog/cd[artist='Bob Dylan']">

Operadores de filtragem válidos são:

  • = (igual)
  • != (diferente)
  • &lt; (menor que)
  • &gt; (maior que)

Dê uma olhada na folha de estilos XSL ajustada:

  <?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="/">
    <html>
      <body>
  	  <h2>My CD Collection</h2>
  	  <table border="1">
  	    <tr>
  		  <th>Title</th>
            <th>Artist</th>
          </tr>
  		<xsl:for-each select="catalog/cd[artist='Bob Dylan']">
  		<tr>
  		  <td><xsl:value-of select="title"/></td>
  		  <td><xsl:value-of select="artist"/></td>
  		</tr>
  		</xsl:for-each>
  	  </table>
  	</body>
    </html>
  </xsl:template>
  
  </xsl:stylesheet>

O resultado

O resultado da transformação será esse:

My CD Collection

Title Artist
Empire Burlesque Bob Dylan

Se você tem o Netscape 6 ou o IE 5 ou superior você pode ver: o arquivo XML e o arquivo XSL.

Veja o resultado com o Netscape 6 ou IE 6

Veja o resultado com o IE 5

O elemento <xsl:sort>

O elemento <xsl:sort> é usado para ordenar o resultado.

Onde colocar a Informação de Ordenação

Para gerar um arquivo XML como um arquivo XHTML, e ordená-lo ao mesmo tempo, simplesmente adicione um elemento sort dentro de um elemento for-each no seu arquivo XSL:

  <?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="/">
    <html>
    <body>
      <h2>My CD Collection</h2>
      <table border="1">
        <tr bgcolor="#9acd32">
          <th>Title</th>
          <th>Artist</th>
        </tr>
  	  <xsl:for-each select="catalog/cd">
  	  <xsl:sort select="artist"/>
  	  <tr>
  	    <td><xsl:value-of select="title"/></td>
          <td><xsl:value-of select="artist"/></td>
        </tr>
        </xsl:for-each>
      </table>
    </body>
    </html>
  </xsl:template>
  
  </xsl:stylesheet>

O atributo select indica qual elemento XML a ordenar.

O resultado

O resultado da transformação será esse:

My CD Collection

Title Artist
Romanza Andréa Bocelli
One night only Bee Gees
Empire Burlesque Bob Dylan
Hide your heart Bonnie Tyler
The very best of Cat Stevens
Greatest Hits Dolly Parton
Sylvias Mother Dr.Hook
Eros Eros Ramazzotti
Still got the blues Gary Moore
Unchain my heart Joe Cocker
Soulsville Jorn Hoel
For the good times Kenny Rogers
Midt om natten Kim Larsen
Pavarotti Gala Concert Luciano Pavarotti
1999 Grammy Nominees Many
The dock of the bay Otis Redding
When a man loves a woman Percy Sledge
Maggie May Rod Stewart
Stop Sam Brown
Black angel Savage Rose
Picture book Simply Red
Bridge of Spies T`Pau
Red The Communards
Private Dancer Tina Turner
Tupelo Honey Van Morrison
Big Willie style Will Smith

Se você tem o Netscape 6 ou o IE 5 ou superior você pode ver: o arquivo XML e o arquivo XSL.

Veja o resultado com o Netscape 6 ou IE 6

Nota: Não é possivel ver o resultado com o IE 5, porque o namespace "http://www.w3.org/TR/WD-xsl" não intrepreta o elemento <xsl:sort>.

O elemento <xsl:if>

O elemento <xsl:if> contém um padrão que só será aplicado se uma condição específica for verdadeira.

Onde colocar a condição IF

Para colocar um teste condicional frente ao conteúdo de um arquivo, simplesmente adicione um elemento <xsl:if> no documento XSL como abaixo:

<xsl:if test="price &gt; 10"> alguma saida... </xsl:if>

O valor do atributo obrigatório test a expressão a ser avaliada.

Dê uma olhada na folhas de estilos XSL ajustada:

  <?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="/">
    <html>
    <body>
      <h2>My CD Collection</h2>
      <table border="1">
        <tr bgcolor="#9acd32">
          <th>Title</th>
          <th>Artist</th>
        </tr>
        <xsl:for-each select="catalog/cd">
  	  <xsl:if test="price &gt; 10">
          <tr>
            <td><xsl:value-of select="title"/></td>
            <td><xsl:value-of select="artist"/></td>
          </tr>
        </xsl:if>
        </xsl:for-each>
      </table>
    </body>
    </html>
  </xsl:template>
  </xsl:stylesheet>

O código acima somente seleciona o título e artista SE o preço do cd for maior que 10.

O resultado

O resultado da transformação será esse:

My CD Collection

Title Artist
Empire Burlesque Bob Dylan
Still got the blues Gary Moore
One night only Bee Gees
Romanza Andréa Bocelli
Black Angel Savage Rose
1999 Grammy Nominees Many

Se você tem o Netscape 6 ou o IE 5 ou superior você pode ver: o arquivo XML e o arquivo XSL.

Veja o resultado com o Netscape 6 ou IE 6

Nota: Não é possivel ver o resultado com o IE 5, porque o namespace "http://www.w3.org/TR/WD-xsl" não interpreta o elemento <xsl:if>.

O elemento <xsl:choose>

O elemento <xsl:choose> é usado em conjunto com <xsl:when> e <xsl:otherwise> para expressar múltiplos testes condicionais.

Onde colocar a condição Choose

Para inserir o teste condicional choose frente ao conteúdo de um arquivo XML, simplesmente adicione os elementos <xsl:choose>, <xsl:when> e <xsl:otherwise> no seu arquivo XSL como abaixo:

<xsl:choose> <xsl:when test="price &gt; 10"> ...algum código... </xsl:when> <xsl:otherwise> ...algum código... </xsl:otherwise> </xsl:choose>

Veja a folha de estilos XSL ajustada:

  <?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="/">
    <html>
    <body>
      <h2>My CD Collection</h2>
      <table border="1">
        <tr bgcolor="#9acd32">
          <th>Title</th>
          <th>Artist</th>
        </tr>
  	  <xsl:for-each select="catalog/cd">
  	  <tr>
  	    <td><xsl:value-of select="title"/></td>
  		<xsl:choose>
  		  <xsl:when test="price &gt; 10">
  		    <td bgcolor="FF000FF">
  			  <xsl:value-of select="artist"/>
  			</td>
  		  </xsl:when>
  		  <xsl:otherwise>
  		    <td><xsl:value-of select="artist"/></td>
  		  </xsl:otherwise>
  		</xsl:choose>
  	  </tr>
  	  </xsl:for-each>
  	</table>
    </body>
    </html>
  </xsl:template>
  
  </xsl:stylesheet>

O código acima irá colorir o fundo da coluna artista de rosa QUANDO (WHEN) o preço do cd for maior que 10.

O resultado

Se você tem o Netscape 6 ou o IE 5 ou superior você pode ver: o arquivo XML e o arquivo XSL.

Veja o resultado com o Netscape 6 ou IE 6

Nota: Não é possivel ver o resultado com o IE 5, porque o namespace "http://www.w3.org/TR/WD-xsl" não interpreta o elemento <xsl:choose>.

Um outro exemplo

Aqui está um outro exemplo que contém vários elementos <xsl:when>:

  <?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="/">
    <html>
    <body>
      <h2>My CD Collection</h2>
      <table border="1">
        <tr bgcolor="#9acd32">
          <th>Title</th>
          <th>Artist</th>
        </tr>
        <xsl:for-each select="catalog/cd">
        <tr>
          <td><xsl:value-of select="title"/></td>
          <xsl:choose>
  		  <xsl:when test="price &gt; 10">
  		    <td bgcolor="#ff00ff">
                <xsl:value-of select="artist"/>
  			</td>
  		  </xsl:when>
  		  <xsl:when test="price &gt; 9 and price &lt;= 10">
  		    <td bgcolor="#CCCCCC">
  			  <xsl:value-of select="artist"/>
  			</td>
  		  </xsl:when>
  		  <xsl:otherwise>
  		    <td><xsl:value-of select="artist"/></td>
            </xsl:otherwise>
          </xsl:choose>
        </tr>
        </xsl:for-each>
      </table>
    </body>
    </html>
  </xsl:template>
  
  </xsl:stylesheet>

O código acima irá colorir o fundo coluna artista de rosa QUANDO (WHEN) o preço do cd for maior que 10 e irá colorir de cinza QUANDO (WHEN) o preço do cd for maior que 9 e menor ou igual a 10.

O resultado

Se você tem o Netscape 6 ou o IE 5 ou superior você pode ver: o arquivo XML e o arquivo XSL.

Veja o resultado com o Netscape 6 ou IE 6

Nota: Não é possivel ver o resultado com o IE 5, porque o namespace "http://www.w3.org/TR/WD-xsl" não interpreta o elemento <xsl:choose>.

O elemento <xsl:apply-templates>

O elemento <xsl:apply-templates> aplica uma regra de molde ao elemento corrente ou aos nós filhos do elemento corrente.

O elemento <xsl:apply-templates>

O elemento <xsl:apply-templates> aplica uma regra de molde ao elemento corrente ou aos nós filhos do elemento corrente.

Se nós adicionarmos um atributo de seleção ao elemento <xsl:apply-templates> ele irá processar somente o elemento filho que combinar com o valor do atributo. Nós podemos usar o atributo de seleção para especificar a ordem na qual os nós filhos são processados.

Veja a folha de estilos XSL abaixo:

  <?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="/">
  <html>
    <body>
      <h2>My CD Collection</h2>
  	<xsl:apply-templates/>
    </body>
  </html>
  
  <xsl:template match="cd">
    <p>
      <xsl:apply-templates select="title"/>
      <xsl:apply-templates select="artist"/>
    </p>
  </xsl:template>
  
  <xsl:template match="title">
    Title: <span style="color:#FF0000">
    <xsl:value-of select="."/></span>
    <br/>
  </xsl:template>
  
  <xsl:template match="artist">
    Artist: <span style="color:#00FF00">
    <xsl:value-if select="."/></span>
    <br/>
  </xsl:template>
  
  </xsl:stylesheet>

O resultado

Se você tem o Netscape 6 ou o IE 5 ou superior você pode ver: o arquivo XML e o arquivo XSL.

Veja o resultado com o Netscape 6 ou IE 6

Nota: Não é possivel ver o resultado com o IE 5, porque o namespace "http://www.w3.org/TR/WD-xsl" não interpreta o elemento <xsl:apply-templates>.

XSLT - No Cliente

Se o seu browser suporta XSLT, este pode ser usado para transformar o documento em XHTML no seu browser.

Uma solução JavaScript

No capítulo anterior nos explicamos como o XSLT pode ser usado para transformar um documento de XML para XHTML. Nós adicionamos uma folha de estilos XSL ao arquivo XML e deixamos o browser fazer a transformação.

Mesmo que isso funcione bem, nem sempre é desejável incluir uma referência a uma folha de estilos no arquivo XML (isto é, não funcionará num browser que não reconhece XSLT.)

Uma solução mais versátil seria usar um JavaScript para fazer a transformação XML em XHTML.

Usando JavaScript nós podemos:

  • fazer testes para browsers específicos
  • usar diferentes folhas de estilos de acordo com o browser e com as necessidades do usuário

Essa é a beleza do XSLT. Um dos objetivos desenhados para o XSLT era o de tornar possível transformar dados de um formato para outro, suportando browsers diferentes e necessidades de usuários diferentes.

A transformação XSLT do lado do cliente está para ser uma das maiores tarefas para os browsers no futuro, como nós veremos um crescimento no mercado de browsers especializados (Braille, browsers para deficientes auditivos, impressoras web, dispositivos handhelds, etc.)

O arquivo XML e o arquivo XSL

Dê uma nova olhada no arquivo XML que nós vimos nos capítulos anteriores:

  <?xml version="1.0" encoding="ISO-8859-1"?>
  <catalog>
    <cd>
      <title>Empire Burlesque</title>
      <artist>Bob Dylan</artist>
      <country>USA</country>
      <company>Columbia</company>
      <price>10.90</price>
      <year>1985</year>
    </cd>
  .
  .
  .
  </catalog>

Se você tem o Netscape 6 ou o IE 5 ou superior você pode ver o arquivo XML.

E a folha de estilos XSL:

  <?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="/">
    <html>
      <body>
  	  <h2>My CD Collection</h2>
  	  <table border="1">
  	    <tr bgcolor="#9ACD32">
  		  <th align="left">Title</th>
  		  <th align="left">Artist</th>
  		</tr>
  		<xsl:for-each select="catalog/cd">
  		<tr>
  		  <td><xsl:value-of select="title"/></td>
  		  <td><xsl:value-of select="artist"/></td>
  		</tr>
  		</xsl:for-each>
  	  </table>
  	</body>
    </html>
  </xsl:template>
  
  </xsl:stylesheet>

Se você tem o Netscape 6 ou o IE 5 ou superior você pode ver o arquivo XSL.

Nota: Perceba que o arquivo XML não tem uma referência para o arquivo XSL.

IMPORTANTE: A nota acima indica que um arquivo XML pode ser transformado usando muitos arquivos XSL diferentes.

Transformando XML em XHTML no seu browser

Aqui está o código fonte necessário para transformar o arquivo XML em XHTML no cliente:

  <html>
  <body>
  
  <script type="text/javascript">
  
  //Carrega o XML
  var xml = new ActiveXObject("Microsoft.XMLDOM")
  xml.async = false
  xml.load("cdcatalog.xml")
  
  //Carrega o XSL
  var xsl = ActiveXObject("Microsoft.XMLDOM")
  xsl.async = false
  xsl.load("cdcatalog.xsl")
  
  //Transforma
  document.write(xml.transformNode(xsl))
  
  </script>
  
  </body>
  </html>

Se você não sabe JavaScript, você pode estudar pelo nosso tutorial Javascript.

O primeiro bloco de código cria uma instância do Microsoft XML parser (XMLDOM) e carrega o documento XML na memória. O segundo bloco de código cria uma outra instância do parser e carrega o documento XSL na memória. A última linha de código transforma o documento XML usando o documento XSL, e escreve o resultado no documento XHTML. Legal!

Se você tem o IE 6.0: Veja como funciona.

Se você tem o IE 5.0: Veja como funciona.

XSLT - No Servidor

Como nem todos os browsers suportam XSLT, uma solução é transformar o XML em XHTML no servidor.

A Cross Browser Solution (??)

No capítulo anterior nós explicamos como XSLT pode ser usado para transformar um documento XML em XHTML no browser. Nós deixamos um JavaScript usar um parser XML para fazer a transformação. Esta solução não funcionará em um browser que não suporte um parser XML.

Para fazer os dados XML disponíveis para todo tipo de browser, nós temos que transformar o documento XML no SERVIDOR e enviá-lo como XHTML puro para o BROWSER.

Essa é uma outra beleza do XSLT. Um dos objetivos desenhados para o XSLT era o de tornar possível transformar dados de um formato para outro em um servidor, retornando dados legíveis para todos os tipos de browsers futuros.

A transformação XSLT no servidor está para ser uma das maiores tarefas do Servidor de Informações de Internet (Internet Information Server) no futuro, assim como veremos um crescimento no mercado de browsers especializados (Braille, browsers para deficientes auditivos, impressoras web, dispositivos handheld, etc.)

O arquivo XML e o arquivo XSL

Dê uma nova olhada no arquivo XML que nós vimos nos capítulos anteriores:

  <?xml version="1.0" encoding="ISO-8859-1"?>
  <catalog>
    <cd>
      <title>Empire Burlesque</title>
      <artist>Bob Dylan</artist>
      <country>USA</country>
      <company>Columbia</company>
      <price>10.90</price>
      <year>1985</year>
    </cd>
  .
  .
  .
  </catalog>

Se você tem o Netscape 6 ou o IE 5 ou superior você pode ver o arquivo XML.

E a folha de estilos XSL:

  <?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="/">
    <html>
      <body>
  	  <h2>My CD Collection</h2>
  	  <table border="1">
  	    <tr bgcolor="#9ACD32">
  		  <th align="left">Title</th>
  		  <th align="left">Artist</th>
  		</tr>
  		<xsl:for-each select="catalog/cd">
  		<tr>
  		  <td><xsl:value-of select="title"/></td>
  		  <td><xsl:value-of select="artist"/></td>
  		</tr>
  		</xsl:for-each>
  	  </table>
  	</body>
    </html>
  </xsl:template>
  
  </xsl:stylesheet>

Se você tem o Netscape 6 ou o IE 5 ou superior você pode ver o arquivo XSL.

Nota: Perceba que o arquivo XML não tem uma referência para o arquivo XSL.

IMPORTANTE: A nota acima indica que um arquivo XML pode ser transformado usando muitos arquivos XSL diferentes.

Transformando XML em XHTML no Servidor

Aqui está o código fonte necessário para transformar o arquivo XML em XHTML no servidor:

  <%
  'Carrega o XML
  set xml = Server.CreateObject("Microsoft.XMLDOM")
  xml.async = false
  xml.load(Server.MapPath("cdcatalog.xml"))
  
  'Carrega o XSL
  set xsl = Server.CreateObject("Microsoft.XMLDOM")
  xsl.async = false
  xsl.load(Server.MapPath("cdcatalog.xsl"))
  
  'Transforma o arquivo
  Response.Write(xml.transformNode(xsl))
  %>

Dica: Se você não conhece ASP, você pode estudar nosso tutorial ASP.

O primeiro bloco de código cria uma instância do Microsoft XML parser (XMLDOM) e carrega o arquivo XML na memória. O segundo bloco de código cria uma outra instância do parser e carrega o documento XSL na memória. A última linha de código transforma o documento XML usando o documento XSL, e escreve o resultado para o browser. Legal!

Veja como funciona.

Referências



Veja a relação completa dos artigos de Otávio Augusto Bizetto Penatti

 

 

Opinião dos Leitores

Sergio
10 Set 2014, 19:51
Da erro no primeiro exemplo:
Erro at line 1, column 8: XML declaration allowed only at the start of the document
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script