XSLT

From TocaWiki
Revision as of 09:07, 21 April 2022 by Jaume (talk | contribs) (Afegir contingut als elements)
Jump to: navigation, search

Maneres de transformar un XML

XML està pensat sobretot per a emmagatzemar i intercanviar informació, de manera que si cal representar les dades d’una manera diferent per optimitzar un procés o per millorar-ne la visualització hi haurà diverses possibilitats:

  • Desenvolupar un programa
    Com que és relativament senzill treballar amb XML, es podria desenvolupar un programa que agafi les dades XML i generi la sortida tal com la volem. Això té l’inconvenient que caldrà tenir coneixements de programació i que pot representar molta feina encara que el que calgui fer sigui trivial.
  • Fer servir CSS
    En molts casos una solució senzilla seria fer servir CSS per representar la informació de manera més amigable fent servir un navegador. Però només serveix per canviar la visualització, no per canviar el document.
  • Transformar el document
    Una solució alternativa consisteix a transformar el document en un altre que estigui pensat per ser visualitzat. Hi ha molt formats que estan pensats sobretot per ser visualitzats: PDF, HTML, XHTML, etc.

CSS

Mitjançant llenguatge CSS podem modificar la manera com es representa la informació que conté el fitxer XMl i adaptar-la a les nostres necessitats. Aquest mètode té la limitació que no ens permet modificar la seqüència d'aparició de la informació ni ens permet afegir informació extra a la que mostra el XML. Per exemple, si tenim un fitxer XML amb la següent informació:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="books.css"?>
<bookstore>  
    <book category="COOKING">  
        <title lang="en">Everyday Italian</title>  
        <author>Giada De Laurentiis</author>  
        <year>2005</year>  
        <price>30.00</price>  
    </book>  
    <book category="CHILDREN">  
        <title lang="en">Harry Potter</title>  
        <author>J K. Rowling</author>  
        <year>2005</year>  
        <price>29.99</price>  
    </book>  
    <book category="WEB">  
        <title lang="en">Learning XML</title>  
        <author>Erik T. Ray</author>  
        <year>2003</year>  
        <price>39.95</price>  
    </book>  
</bookstore>

I l'enllacem amb el següent fitxer CSS

bookstore{
    background-color: darkgray;
}
title{
    font-size: 30px;
    color:brown
}

book {
    display: block;
}
author{
    display: block;
    font-size: 15px;
    font-style:italic;
}

price {
    display: block;
    font-weight: bold;
    padding-bottom: 30px;
}

Com a resultat tindrem la següent pàgina web:

Resultat de XML + CSS

Tot i la modificació en la forma de presentació, CSS té moltes limitacions a l’hora de presentar la informació:

  • La informació no pot ser reordenada con vulguem. L’única manera de simular el canvi d’ordre és fer servir posicionaments absoluts.
  • Els atributs es poden mostrar però hi ha moltes limitacions per fer-ho.
  • No es poden afegir estructures noves producte de càlculs o de procés de les dades del document.
  • No té maneres senzilles de formatar les dades en pàgines de text per ser impreses.

Per tant, si l’objectiu final no és simplement decorar el fitxer sinó transformar-lo en un altre document totalment diferent, CSS no serveix. CSS no transforma el document sinó que simplement canvia la manera com es visualitza.

Transformacions

Per superar les mancances de CSS a l'hora de transformar documents va aparèixer un nou llenguatge :XSL

XSL és una família de llenguatges que ens permeten definir transformacions i presentacions de documents XML.

La família de llenguatges XSL està formada per tres llenguatges:

  • XSL-FO(XSL Formatting Objects): és un llenguatge per definir el format que s'ha d'aplicar a un document.
  • XSLT(XSL transformations): és un llenguatge per ens permet transformar documents XML.
  • XPath: és un llenguatge que ens permet accedir a parts dels documents XML.

XPath

XSLT

XSLT (extensible stylesheet language for transformations) és un llenguatge de plantilles basat en XML que permet convertir l’estructura dels elements XML en altres documents.

Nosaltres l'utilitzarem per a partir de la informació que conté el fitxer XML generar un fitxer HTML per mostrar-ne la informació del mateix.

XSLT fa servir XPath per identificar les diferents parts de la informació del document XML. Un cop seleccionades les diferents parts del document XML, utilitzant XSLT, es segueixen una sèrie de patrons definits en el fitxer, que determinen com generar el document de sortida (HTML).

El fitxer XSLT actua de la mateixa manera com actua un fitxer CSS en HTML. Cal enllaçar el document XSLT amb el fitxer XML. Per crear aquest enllaç cal incloure en la capçalera del document XML la següent línia de codi:

  <?xml-stylesheet type="text/xsl" href="fitxerXSL.xsl"?>

Per tant, si volem enllaçar un full XSLT al document XML de l'exemple anterior aquest quedaria de la següent manera:

  <?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="fitxerXSL.xsl"?>
  <bookstore>  
    <book category="COOKING">  
        <title lang="en">Everyday Italian</title>  
        <author>Giada De Laurentiis</author>  
        <year>2005</year>  
        <price>30.00</price>  
    </book>  
    <book category="CHILDREN">  
        <title lang="en">Harry Potter</title>  
        <author>J K. Rowling</author>  
        <year>2005</year>  
        <price>29.99</price>  
    </book>  
    <book category="WEB">  
        <title lang="en">Learning XML</title>  
        <author>Erik T. Ray</author>  
        <year>2003</year>  
        <price>39.95</price>  
    </book>  
  </bookstore>

Funcionament XSLT

El fitxer XSLT intentarà fer les tranformacions utilitzant les plantilles definides per cada un dels elements seleccionats per les mateixes. Una plantilla selecciona utilitzant XPath l'element que ha de transformar, i aplica les transformacions definides dins seu.

Si hi ha algun element que no es pugui processar amb una plantilla aquest es transformarà amb el funcionament per defecte:

  • Si el node té contingut es retornarà el contingut del node
  • Si el node no té contingut no es retornarà cap contingut

Els fitxers XSLT es defineixen amb les etiquetes <xsl:stylesheet>. Per tant, l'estructura mínima d'un fitxer XSLT seria:

<?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  
  </xsl:stylesheet>

La línia 1 és la capçalera de fitxer XML, en tant que es tracta d'un fitxer de llenguatge de marques XML. I la línia 2 és el node arrel que engloba tot el contingut del fitxer XSLT.

Per tant, si ara aquest fitxer el guardem amb el nom fitxerXSL.xsl, i el guardem en el mateix directori que el nostre XML, ja tindrem els dos fitxers enllaçats i el resultat seria alguna cosa semblant a això:

Resultat de XML + XSLT

Podem veure que únicament apareixen els valors que contenen cada un dels elements del XML. Això és degut a que encara no hem definit cap plantilla de transformació, i per tant cap dels elements és seleccionat per una plantilla i per tant tots estan sent processats amb el comportament per defecte abans comentat.

Anem a crear una primera plantilla per processar, per exemple, els nodes YEAR. Volem que cada element YEAR mostri el text Aqui hi haurà el valor de l'any. Ho fariem de la següent manera:

  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="//YEAR">
      Aqui hi haurà el valor de l'any 
    </xsl:template>
  </xsl:stylesheet>

Les etiquetes <xsl:template match=""> són les que defineixen una plantilla. Dins de l'atribut match hi hem d'incloure la sentència XPath que seleccionarà els elements als que s'aplicarà la plantilla. En aquest cas volem que s'apliqui sobre els elements YEAR per tant, el nostre XPath serà //YEAR

I ara si apliquem el XSLT sobre el XML el resultat serà:

Resultat de XML + XSLT

Podem comprovar que ara enlloc del valor de l'any, el que ha aparegut per pantalla ha estat el el text "Aquí hi haurà el valor de l'any". Per tant, l'element YEAR ha estat processat correctament i ha mostrar el valor que hem especificat a la plantilla.

Fixeu-vos que el text ha aparegut en cada una de les ocurrències de l'etiqueta YEAR. Per tant és com si féssim un bucle que passa per totes i cada una de les etiquetes.

Afegir contingut als elements

Serà habitual voler afegir contingut HTML dins la plantilla XSLT que hem creat. De fet, aquest és un dels objectius finals de fer les transformacions.

Per exemple, ens pot interessar mostrar el text Aquí hi haurà el valor de l'any en negreta.

Per fer-ho simplement haurem d'incloure dins la plantilla el codi HTML que necessitem per tal d'aconseguir el nostre objectiu de fer el text en negreta. Concretament quedaria de la següent manera:

  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="html" version="4.0"/>
    <xsl:template match="//YEAR">
      <b>Aqui hi haurà el valor de l'any </b>
    </xsl:template>
  </xsl:stylesheet>

I el resultat quedaria de la següent manera:

Resultat de XML + XSLT

I si volguéssim que a més ho fes dins un paràgraf HTML nou, fariem:

  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="html" version="4.0"/>
    <xsl:template match="//YEAR">
      <p><b>Aqui hi haurà el valor de l'any </b><p>
    </xsl:template>
  </xsl:stylesheet>

I quedaria de la següent manera:

Resultat de XML + XSLT

Fixeu-vos que cal afegir la línia <xsl:output method="html" version="4.0"/> per tal d'indicar que el fitxer de sortida serà HTML i que per tant s'interpretin les etiquetes b i p com a tals. En cas contrari s'entén que el resultat de la transformació és un XML i per tant no es reconeix l'etiqueta p com a paràgraf ni la b com a negreta.

Això canvia quan ja incloem les etiquetes html head body ja que el navegador amb aquestes etiquetes sí que entén que el document és un HTML i interpreta les etiquetes que trobi en el document com a tals.

Obtenir valors

En molts casos ens interessarà mostrar el valor de l'etiqueta en el nostre fitxer HTML generat. Ho haurem de fer utilitzant la següent etiqueta:

  <xsl:value-of select="XXXXX"></xsl:value-of>

Aquesta etiqueta XSLT ens retorna el valor de l'element seleccionat dins l'atribut select utilitzant una sentència XPath. Hem de tenir en compte que com que estem dins una plantilla de transformació on ja s'ha seleccionat un element, el de la plantilla, la selecció en l'etiqueta xsl:select es farà a partir de l'element seleccionat en la plantilla.