AeroPlanos

Aero

Aero

S.O.S. XSL

XSL - eXtensible Stylesheet Language

Introdução

XML é um formato de ficheiros para armazenar bases de dados.

XSL (eXtensible Stylesheet Language) é uma linguagem especialmente concebida para controlar a apresentação dos dados armazenados nos "ficheiros.XML"

XSL é constituida por três partes:

Uma livraria necessita de um ficheiro dos livros que vende. Com XSL esse ficheiro pode ser consultado da forma que se desejar, ordenando os livros por editor, autor, etc., ou apresentando apenas os livros sobre determinado assunto, língua...

XSL actua transformando o ficheiro XML original (source tree) noutro ficheiro XML (result tree) utilizando XSLT.

Nesse processo de transformação XSLT utiliza XPath para definir as partes do documento original (source) identificados como os items que se pretendem seleccionar (that match predefined templates). Quando isso acontece, XSLT transforma as partes identificadas do documento original (source), no novo documento (result).

Exemplo de um ficheiro XML

O exemplo seguinte é um ficheiro dos livros exitentes numa biblioteca:

— "biblioteca.xml"
<?xml version="1.0" encoding="ISO-8859-1" ?>

<biblioteca>

<livro>
<autor>LONDON, Jack</autor>
<titulo>Memórias de um alcoólico. John Barleycorn</titulo>
<editor>Antígona</editor>
<ano>2001</ano>
<resumo><para>Para já, como autobiografia,...</para></resumo>
</livro>

<livro>
<autor>DAVID-NÉEL, Alexandra</autor>
<titulo>Viagem ao Tibete</titulo>
<editor>Civilização Editora</editor>
<ano>1998</ano>
<resumo><para>Podemos dizer deste livro...</para></resumo>
</livro>
...
</biblioteca>

Será a base de dados (source) a utilizar nos próximos capítulos.

Criar um ficheiro XSL

Para apresentar os títulos dos livros exitentes na biblioteca e o seu autor, criou-se o ficheiro:

— "biblioteca1.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>
    <table border="1" align="center">
      <tr>
        <th>Autor</th>
        <th>Título</th>
      </tr>
      <xsl:for-each select="biblioteca/livro">
      <tr align="left">
        <td><xsl:value-of select="autor"/></td>
        <td><xsl:value-of select="titulo"/></td>
      </tr>
      </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

Notas:

— Como a folha de estilo é ela mesma um documento XML, o ficheiro inicia-se com a declaração deste tipo de documento, sendo também útil definir o conjunto de caracteres em utilização, neste caso "Latin 1 character set":

<?xml version="1.0" encoding="ISO-8859-1"?>

— Depois a declaração de "Style Sheet":

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

Referenciar a "Stylesheet" utilizando...
href="documento.xsl"

No documento XML cria-se uma referência à folha de estilo, introduzindo a linha de comando:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<?xml-stylesheet type="text/xsl" href="biblioteca1.xsl"?>
<biblioteca>
...
— "biblioteca_href_xsl.xml"

O resultado obtido será:

Referenciar a "Stylesheet" utilizando...
JavaScript

Cria-se um ficheiro.html contendo um "script" para transformar os dois documentos (.xml e .xsl) num documento XHTML.

— "Transform_to_XHTML.html"
<html>
<body>

<script type="text/javascript">

// Load XML 
var xml = new ActiveXObject("Microsoft.XMLDOM")
xml.async = false
xml.load("biblioteca.xml")

// Load XSL
var xsl = new ActiveXObject("Microsoft.XMLDOM")
xsl.async = false
xsl.load("biblioteca1.xsl")

// Transform
document.write(xml.transformNode(xsl))

</script>

</body>
</html>

O ficheiro .html interpreta os dois documentos (.xml e .xsl) e transforma-os num documento XHTML por intermédio do browser.

O resultado é idêntico, mas...

...desta forma, manteve-se a base de dados intacta! — "biblioteca.xml"

Templates

Uma folha de estilo XSL consiste numa série de regras chamadas "templates".

The <xsl:template> element contains rules to apply when a specified node is matched.

O atributo match é utilizado para associar o template a um elemento.
(match="/" referencia o documento na totalidade)

<?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>
  ...
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

Nota:

Todos os comandos <tag> devem terminar com </tag> uma vez que XSL é uma linguagem XHTML (eXtensible HyperText Markup Language).

Elementos

Retomando o exemplo inicial, vamos observar o resultado alterando as variáveis dos elementos utilizados.

<xsl:for-each>
<xsl:value-of>

Alterando...

<xsl:for-each select="biblioteca/livro">

... para:

...
<xsl:for-each select="biblioteca/livro[autor='DAVID-NÉEL, Alexandra']">
<tr align="left">
<td><xsl:value-of select="autor"/></td>
<td><xsl:value-of select="titulo"/></td>
</tr>
...
— "biblioteca2.xsl"

Resulta:

<xsl:sort>
<xsl:value-of>

Introduzindo um filtro para ordenar a apresentação relativamente ao ano, por ordem ascendente:

<xsl:for-each select="biblioteca/livro">
<xsl:sort select="ano" data-type="number" order="ascending"/>
<tr align="left">
<td><xsl:value-of select="autor"/></td>
<td><xsl:value-of select="titulo"/></td>
<td align="right"><xsl:value-of select="ano"/></td>
</tr>
— "biblioteca3.xsl"

Resulta:

<xsl:if>

Este elemento utiliza-se para verificar uma condição.

Operators:

Quais os livros... se... ano (&gt; greater than) maior que 2000:

<xsl:for-each select="biblioteca/livro">
<xsl:if test="ano &gt; 2000">
...
</xsl:if>
</xsl:for-each>
— "biblioteca4.xsl"

Resulta:

<xsl:choose>

Se se pretenderem seleccionar (choose) items, quando (when) se verificar mais do que uma condição... caso contrário (otherwise):

<xsl:for-each select="biblioteca/livro">
  <xsl:choose>
    <xsl:when test="ano &gt; 2000">
      <tr bgcolor="#ffddcc">
      <td><xsl:value-of select="autor"/></td>
      <td><xsl:value-of select="titulo"/></td>
      </tr>
    </xsl:when>
    <xsl:when test="ano &gt; 1999 and ano &lt;= 2000">
      <tr bgcolor="#ffeedd">
        <td><xsl:value-of select="autor"/></td>
        <td><xsl:value-of select="titulo"/></td>
      </tr>
    </xsl:when>
    <xsl:otherwise>
      <tr bgcolor="#ffeeff">
        <td><xsl:value-of select="autor"/></td>
        <td><xsl:value-of select="titulo"/></td>
      </tr>
    </xsl:otherwise>
  </xsl:choose>
</xsl:for-each>
— "biblioteca5.xsl"

Resulta:


<xsl:apply-templates>

Para além dos elementos como autor, título, editor, etc., o ficheiro da "nossa biblioteca", contém um outro elemento, apelidado "resumo", para cada um dos livro da base de dados.

Os elementos "para" são por sua vez filhos (element's child nodes) do elemento "resumo".
Por outras palavras... cada comentário é constituido por um ou mais parágrafos.

Vejamos o exemplo:

— "biblioteca.xml"
<biblioteca>
...
<livro>
  <imagem name="src">imgs_livros/going-to-the-wars.jpg</imagem> 
  <autor>HASTINGS, Max</autor> 
  <titulo>Going to the Wars</titulo> 
  <editor>Pan Books</editor> 
  <ano>2000</ano> 
  <resumo>
    <para>
      Um grande repórter de guerra conta o que viu e viveu, por
      dentro de alguns dos maiores conflitos mundiais das últimas
      décadas...
    </para> 
    <para>
      Está escrito com sobriedade e humor; sem fanfarronices:
    </para> 
    <para>
      — "Of course, I have often been frightened and run away".
    </para> 
  </resumo>
</livro>
</biblioteca>

Cada um dos elementos <resumo> contem vários elementos <para>.

A instrução <xsl:apply-templates> aplica uma regra "template rule" ao elemento da basae de dados especificado, ou aos seus sub-elementos "element's child nodes".

Vejamos como se usou esta instrução no exemplo:

— "biblioteca6.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>
      <head>
      </head>
      <body>
        <h2>Um livro</h2>
        <xsl:for-each select="biblioteca/livro">
          <p class="floatimg">
            <img src="{imagem}" />
          </p>
          <h4>
            <xsl:value-of select="autor"/>
            - 
            <xsl:value-of select="ano"/>
            &#8212; 
            <i>
              <xsl:value-of select="titulo"/>
            </i>
            , 
            <xsl:value-of select="editor"/>
          </h4>
          <xsl:apply-templates select="resumo/para"/>
          <br clear="all"/>
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>
  <xsl:template match="resumo/para">
    <p class="j">
      <xsl:value-of select="."/>
    </p>
  </xsl:template>
</xsl:stylesheet>

Repare-se que a chamada <xsl:apply-templates select="resumo/para"/> selecciona "resumo/para", econtrando as regras pretendidas <xsl:template match="resumo/para">, ou seja: um parágrafo <p> que engloba os valores de todos os elementos <xsl:value-of select="."/> seleccionados.

O resultado destas instruções de apresentação encontram-se mais à frente nesta página... 6

<xsl:attribute>

A base de dados contém ainda um outro elemento cujo nome é <imagem>. No entanto, este elemento não contém a imagem propriamente dita, mas apenas uma referência especificando qual a sua localização.

Este elemento tem, por conseguinte, características diferentes dos restantes. Para informar de que se trata de um outro tipo de dados, dotou-se de um atributo:

<imagem name="src">

— "biblioteca.xml"
<biblioteca>
...
<livro>
  <imagem name="src">imgs_livros/going-to-the-wars.jpg</imagem> 
  <autor>HASTINGS, Max</autor> 
  <titulo>Going to the Wars</titulo> 
  <editor>Pan Books</editor> 
  <ano>2000</ano> 
  <resumo>
    <para>
      Um grande repórter de guerra conta o que viu e viveu, por
      dentro de alguns dos maiores conflitos mundiais das últimas
      décadas...
    </para> 
    <para>
      Está escrito com sobriedade e humor; sem fanfarronices:
    </para> 
    <para>
      — "Of course, I have often been frightened and run away".
    </para> 
  </resumo>
</livro>
</biblioteca>

Na folha de estilos XSL a imagem é inserida utilizando-se o elemento <xsl:attribute> da seguinte forma:

<img>
  <xsl:attribute name="src">
  <xsl:value-of select="imagem" />
  </xsl:attribute>         
</img>

Este código pode ser abreviado da seguinte forma:

<img src="{imagem}" />

O exemplo da folha de estilos XSL completo é o seguinte:

— "biblioteca6.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>
      <head>
      </head>
      <body>
        <h2>Um livro</h2>
        <xsl:for-each select="biblioteca/livro">
          <p class="floatimg">
            <img src="{imagem}" />
          </p>
          <h4>
            <xsl:value-of select="autor"/>
            - 
            <xsl:value-of select="ano"/>
            &#8212; 
            <i>
              <xsl:value-of select="titulo"/>
            </i>
            , 
            <xsl:value-of select="editor"/>
          </h4>
          <xsl:apply-templates select="resumo/para"/>
          <br clear="all"/>
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>
  <xsl:template match="resumo/para">
    <p class="j">
      <xsl:value-of select="."/>
    </p>
  </xsl:template>
</xsl:stylesheet>

Resultado:


Ana Cristina Sousa Martins


Próximos capítulos

Como introduzir links em XSL.