graphic with four colored squares

Tendencias en XSLT

Jose Emilio Labra Gayo

Noviembre 2006

Contenidos

Tendencias en XSLTJose Emilio Labra GayoNoviembre 2006

Ejecución en servidor

Programación XSLT en Java

Programación XSLT en Java: Ejemplo

String xml="file.xml";
String xsl="tr.xsl";

TransformerFactory f = 
 TransformerFactory.newInstance();
Transformer 	   t = 
 f.newTransformer(new StreamSource(new File(xsl)));
        
t.transform(new StreamSource(new File(xml)),
            new StreamResult(System.out));

Marcos de publicación XML

Ejecución en cliente

Asociación directa de hoja de estilos

Los navegadores incluyen una implementación de XSLT

Transformación mediante Javascript

Varias librerías:

Aplicaciones de XSLT

Docbook

Docbook es un completo sistema de documentación. Especialmente útil para documentación de proyectos, aunque puede utilizarse en otros contextos.

Está formado por una especificación del vocabulario en SGML DTDs y en Relax NG

Contiene numerosas hojas de estilo para transformar a diferentes formatos: FO, HTML, PDF, etc.

Ejemplo de Docbook

<article>
  <articleinfo>
    <title>Ejemplo</title>
    <author>
      <firstname>Fanjul</firstname>
      <surname>Herrera</surname>
    </author>

    <abstract>
      <para>Este libro resume algunas experiencias</para>
    </abstract>
  </articleinfo>

  <sect1 id="S1">
    <title>La Primavera</title>
    <para>Hablar de la primavera es interesante</para>
  </sect1>
</article>

Schematron

Schematron define un sistema de validación de documentos XML basado en reglas. Reciéntemente aprobado como estándar ISO

Las reglas se definen mediante sentencias XPath

La implementación de referencia fue realizada en XSLT en 2 fases. Una hoja toma las reglas y genera una hoja XSLT que toma el documento y lo valida.

<sch:schema xmlns:sch="http://www.ascc.net/xml/schematron">
  <sch:title>Comprobar emails</sch:title>
   <sch:pattern name="Chequea email">
     <sch:rule context="email">
        <sch:assert test="contains(.,'@')">
         Falta la arroba en el email</sch:assert>
     </sch:rule>
 </sch:pattern>
</sch:schema>

EXSLT

EXSLT

Iniciativa para crear un conjunto de extensiones relativamente estándar.

Soportadas por diversos procesadores: libxml2

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:math="http://exslt.org/math"
  extension-element-prefixes="math" >

 <xsl:template match="/">
  N = <xsl:value-of select="math:random()" />
 </xsl:template> 
</xsl:stylesheet>

XSLT 2.0

XSLT 2.0

Recomendación aprobada en Junio 2006

Funciones y recursividad

<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:m="http://misFunciones.org">
 
 <xsl:template match="/">
  10! = <xsl:value-of select="m:fact(10)" /> 
 </xsl:template> 

 <xsl:function name="m:fact" as="xs:integer">
  <xsl:param name="n" as="xs:integer" />
  <xsl:value-of 
   select="if ($n = 0) then 1
           else $n * m:fact($n - 1)" />
 </xsl:function>
<xsl:stylesheet>

Agrupaciones


<ciudades>
 <ciudad nombre="Londres" 
 	     pais="Inglaterra"/>
 <ciudad nombre="Roma" 
 	     pais="Italia"/>
 <ciudad nombre="Paris" 
 	     pais="Francia"/>
 <ciudad nombre="Venecia" 
 	     pais="Italia"/>
</ciudades>

<xsl:template match="/">
 <xsl:for-each-group 
  select="ciudades/ciudad"
  group-by="@pais">
  <xsl:value-of select="@pais"/>:
  <xsl:value-of 
   select="current-group()/@nombre"/><xsl:text>
</xsl:text>
 </xsl:for-each-group>
 </body>
 </html>
</xsl:template>

Múltiples documentos de salida

<xsl:template match="alumnos">
 <xsl:for-each select="alumno">
  <xsl:result-document 
        href="out/alumno{position()}.html">
    <xsl:apply-templates select="." />   
  </xsl:result-document>
 </xsl:for-each>
</xsl:template>

<xsl:template match="alumno">
 <p><xsl:value-of select="nombre" /></p>
</xsl:template>

Contenidos