Diferència entre revisions de la pàgina «XSL»

De Wiki Eduard Lafitte
Jump to navigationJump to search
 
Línia 74: Línia 74:
*XSL ha estat dissenyat per processar documents XML i per complir amb la sintaxi XML. Per tant, només hauria d'utilitzar-se amb aplicacions XML o amb aplicacions sensibles a XML. Les aplicacions ideals per utilitzar XML i XSL són:  
*XSL ha estat dissenyat per processar documents XML i per complir amb la sintaxi XML. Per tant, només hauria d'utilitzar-se amb aplicacions XML o amb aplicacions sensibles a XML. Les aplicacions ideals per utilitzar XML i XSL són:  


  portals Web, agregadors de notícies, llocs Web de comunitats,
  portals Web, agregadors de notícies, llocs Web de comunitats, qualsevol altra aplicació Web que necessiti enviar informació a diversos dispositius i a un gran nombre de clients.
qualsevol altra aplicació Web que necessiti enviar informació a diversos  
dispositius i a un gran nombre de clients.


*XSLT és un llenguatge basat en la correspondència de patrons. Busca nodes que coincideixin amb una determinada condició i els aplica les regles corresponents. Per tant, XSLT no té la versatilitat de la majoria dels llenguatges de programació.  
*XSLT és un llenguatge basat en la correspondència de patrons. Busca nodes que coincideixin amb una determinada condició i els aplica les regles corresponents. Per tant, XSLT no té la versatilitat de la majoria dels llenguatges de programació.  

Revisió de 01:38, 7 des 2018

Introducció

Aquesta wiki d'XSL preten ser una petita guia de coses bàsiques sobre el funcionament de l'XML, no un manual en profunditat.



Què és XSL?

XSL és per XML el que CSS és per HTML. És un acrònim en anglès d'eXtensible Stylesheet Language (Llenguatge de fulles d'estil ampliable). És un llenguatge dissenyat per presentar dades XML en un format llegible. XSL consta realment de dues parts:

  • XSLT: un llenguatge per transformar documents XML
  • XPath: un llenguatge per navegar en documents XML

XSLT significa Transformacions XSL i és la part més important de l'XSL.

XSLT transforma un document XML en un altre document XML, en una sortida XHTML o en text senzill. Això es sol fer transformant cada element XML en un element HTML.

L'ús de XSL és imprescindible, ja que les etiquetes XML han estat definides per l'usuari i per tant, els navegadors no saben com interpretar-les o representar-les.

De la mateixa forma que tots els documents XML comencen amb una declaració XML. El mateix succeeix amb les fulles d'estils XSL.

La primera línia de qualsevol document XSL és una declaració XML:

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

Per tant ens podríem preguntar:



És el mateix XSL i XML?

Sí i no.

perquè tots dos segueixen les mateixes regles de sintaxis, tot i que amb unes petites diferències que ja anirem veient.

No, perquè tenen diferents funcions: XML emmagatzema dades i XSL els hi aplica format.



Sintaxi XSL

Després de la declaració XML (<?xml version="1.0" encoding="ISO-8859-1"?>) hi ha una declaració XSL

<xsl:stylesheet>


De totes maneres, les aplicacions XSL reals, tenen una declaració una mica més complexa.

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


El motiu és que també inclou l'espai de noms i la versió de l'especificació XSL, segons les recomanacions del W3 Consortium.

A diferència de la declaració XML, la qual s'escriu en una única línia i no té etiqueta de tancament, la declaració XSL ha de tenir una etiqueta de tancament, que serveix per marcar el final de la fulla d'estils XSL:

</xsl:stylesheet>

S'ha de tenir en compte que la definició anterior no infringeix les regles de sintaxis XML: és a dir, una fulla d'estils XSL és un document XML perfectament vàlid, ja que té un únic element arrel i aquest ve especificat per l'etiqueta <xsl:stylesheet>.


Per indicar al navegador quina és la fulla d'estils XSL que ha d'utilitzar per processar el document XML, ha d'incloure la següent declaració en l'arxiu XML, just després de la declaració XML:

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


On utilitzar XSL?

XSL ha estat dissenyat per a unes funcions determinades. Per això resulta la solució perfecta per a alguns casos de desenvolupament, mentre que pot ser inútil per a uns altres:

  • XSL ha estat dissenyat per processar documents XML i per complir amb la sintaxi XML. Per tant, només hauria d'utilitzar-se amb aplicacions XML o amb aplicacions sensibles a XML. Les aplicacions ideals per utilitzar XML i XSL són:
portals Web, agregadors de notícies, llocs Web de comunitats, qualsevol altra aplicació Web que necessiti enviar informació a diversos dispositius i a un gran nombre de clients.
  • XSLT és un llenguatge basat en la correspondència de patrons. Busca nodes que coincideixin amb una determinada condició i els aplica les regles corresponents. Per tant, XSLT no té la versatilitat de la majoria dels llenguatges de programació.
  • XSL no ha estat dissenyat per substituir o complementar CSS. No s'hauria d'utilitzar (i, de fet, no es pot) per aplicar estils a HTML. No obstant això, pot utilitzar-se en llocs Web que necessiten ser redissenyats amb freqüència, que canvien el seu disseny sovint i que necessiten manipular dades en un format flexible.
  • XSL no és una eina d'administració de contingut. No hauria d'utilitzar-se (i, de fet, no es pot) per canviar el contingut de documents XML o per editar informació. No obstant això, es pot utilitzar XML i XSL en un sistema d'administració de contingut que requereixi manejar documents de diverses formes diferents.


Espais de noms

Un espai de noms és exactament el que el seu nom indica: un lloc per a noms.

En ell s'especifica el conjunt de noms d'elements i d'atributs que es poden utilitzar en un determinat document. La funció de l'espai de noms és evitar conflictes de noms.

Aquests conflictes de noms poden sorgir en XML i altres llenguatges relacionats amb XML, ja que aquests llenguatges estan definits per l'usuari. Per exemple, <taula> pot referir-se a una taula de base de dades, a una taula de disseny, a un moble o a un lloc en un restaurant. Com la majoria de les aplicacions processen més d'un document XML alhora, amb freqüència es barregen documents XML en els quals un mateix element té diferents significats.

En XML, els espais de noms s'especifiquen mitjançant l'atribut xmlns de la declaració del document. Es componen d'un URI (Indicador universal de recursos), és a dir, una adreça d'un lloc Web

Per exemple: http://www.w3.org/1999/xsl/transform

El motiu de triar un URI per identificar-ho és que un URI és una dada única i, per tant, és d'esperar que els seus corresponents espais de noms siguin també únics.

L'URI s'utilitza solament com un nom. No es pretén que sigui un vincle a un esquema XML o una indicació del propietari del document.


Plantilla XSL (templates)

De la mateixa forma que els documents XML estan formats per una col·lecció jeràrquica d'elements, els documents XSL es componen d'un conjunt de plantilles o regles.

Cada plantilla defineix les regles que s'apliquen a un determinat node de XML. Una plantilla XSL té el següent aspecte:

<xsl:template match="">
     

</xsl:template>


L'atribut match associa una plantilla XSL amb un element XML.

El node corresponent s'indica com una expressió XPath.

El contingut de l'element <xsl:template> és la regla que ha d'aplicar-se. Normalment correspon a codi HTML que es mostrarà en el navegador.

Imaginem que tenim alguna cosa com això:

Nom Sou
Eduard 3500
Montse 1250
Lluís 750
Jordi 1850

La regla XSL per representar-ho, tindria el següent aspecte:

 <xsl:template match="/">
  <html>
   <body> 
    <table border="1">
      <tr>
        <th>Nom</th>
        <th>Sou</th>
      </tr>
    </table>
   </body>
  </html>
 </xsl:template>


Observarem que el contingut entre les etiquetes table és codi HTML pur. Això indica al navegador que els empleats es mostraran com una taula amb els següents encapçalats de columna: Nom i Sou.


Motrar valors (value-of)

El codi <xsl:template> s'utilitza per definir com es mostrarà un node en el navegador. No obstant això, per visualitzar el contingut real d'un node és necessari utilitzar una altra construcció XSL: <xsl:value-of>. El seu nom (valor de) és bastant intuïtiu. El node, el valor del qual es va a mostrar, s'indica mitjançant l'atribut select, que té com a valor una expressió XPath. Suposem que necessita mostrar el nom d'un empleat del document representat amb la taula anterior. El codi seria així:

<xsl:value-of select="/empresa/departament/empleats/nom"></value-of>

Tornant a l'exemple anterior de la taula, per mostrar els valors dels nodes <nom> i <sou> en la plantilla XSL, es necessita escriure el següent codi:

 <xsl:template match="/">
  <html>
   <body>
    <table boder="1">
      <tr>
        <th>Nom</th>
        <th>Sou</th>
      </tr>
      <tr>
        <td><xsl:value-of select="/empresa/departament/empleats/nom"/></td>
        <td><xsl:value-of select="/empresa/departament/empleats/sou"/></td>
      </tr>
    </table>
   </body>
  </html>
 </xsl:template>

Obtenint quelcom semblant a:

Nom Sou
Eduard 3500

Com veiem, només ens mostrarà el primer empleat.


Bucles (for-each)

Per aconseguir que ens mostri tots els empleats en la taula, hem d'utilitzar un altre constructor XSL molt utilitzat:

<xsl:for-each select="">

El valor de l'atribut select és una expressió XPath que especifica el conjunt de nodes que han de mostrar-se.

Per qui conegui algun altre llenguatge de programació, el constructor <xsl:for-each> realitza la mateixa funció que un bucle for.

Utilitzant el for-each en l'exemple anterior, aconseguirem mostrar tots els empleats de l'XML.

 <xsl:template match="/">
  <html>
   <body>
    <table border="1">
      <tr>
        <th>Nom</th>
        <th>Sou</th>
      </tr>
      <xsl:for-each select="empresa/departament/empleats">
      <tr>
        <td><xsl:value-of select="nom"/></td>
        <td><xsl:value-of select="sou"/></td>
       </tr>
      </xsl:for-each>
    </table>
   </body>
  </html>
 </xsl:template>

En l'exemple anterior veiem que per al nom i el sou no necessiten incloure els nodes pare ni començar en l'arrel del document amb les expresions XPath. Això es degut al fet que la ruta d'aquests elements es calcularà basant-se en l'expressió XPath especificada en el constructor <xsl:for-each>.

Per tant el resultat seria:

Nom Sou
Eduard 3500
Montse 1250
Lluís 750
Jordi 1850

Aquesta vegada si que apareixen tots.


Filtrar elements

Basant-nos en una condició, amb el contructor <xsl:for-each> podrem filtrar els resultats.

 <xsl:template match="/">
  <html>
   <body>
    <table border="1">
      <tr>
        <th>Nom</th>
        <th>Sou</th>
      </tr>
      <xsl:for-each select="empresa/departament/empleats[sou>=1500]">
      <tr>
        <td><xsl:value-of select="nom"/></td>
        <td><xsl:value-of select="sou"/></td>
      </tr>
      </xsl:for-each>
    </table>
   </body>
  </html>
 </xsl:template>

Amb el filtre sou >= 1500 el resultat seria:

Nom Sou
Eduard 3500
Jordi 1850

Per realitzar condicions amb els nodes de l'XML, podrem utilitzar:

  • igual (=)
  • no igual (!=). Per exemple, nom!='Montse'
  • menor que (<). Per exemple, sou<1500
  • menor o igual que (<=)
  • major que (>)
  • major o igual que (>=)
NOTA: S'ha de tenir en compte que es possible que en algun navegador, els símbols < i > no funcionin. Per tant és més recomenable utilitzar el format d'entitats, es a dir, &lt; i &gt; respectivament.


Ordenar elements (sort)

En XSL, podem ordenar elements alfabèticament. Per fer-ho, només cal utilitzar el constructor <xsl:sort /> i especificar el node per el que volem ordenar.

<xsl:sort select="empresa/departament/empleats/nom">

</xsl:sort>

En l'exemple anterior, ordenaríem tots els resultats per el node nom i per defecte en ordre ascendent.

L'element <xsl:sort/> sempre va lligat al constructor <xsl:for-each> per garantir que l'aplicació recorre tots els elements.

Ampliant l'exemple anterior, hi afegirem el sort ordenant per nom de l'article:

 <xsl:template match="/">
  <html>
   <body>
    <table border="1">
      <tr>
        <th>Nom</th>
        <th>Sou</th>
      </tr>
      <xsl:for-each select="empresa/departament/empleats[sou>=1500]">
      <xsl:sort select="nom"/>
      <tr>
        <td><xsl:value-of select="nom"/></td>
        <td><xsl:value-of select="sou"/></td>
      </tr>
      </xsl:for-each>
    </table>
   </body>
  </html>
 </xsl:template>


Per tant el resultat seria:

Nom Sou
Eduard 3500
Jordi 1850
Lluís 750
Montse 1250

Per canviar entre ordre ascendent i descendent hem d'afegir un atribut a l'element <xsl:sort/>

<xsl:sort select="nom" order="descending"/>

Canviant això el resultat seria:

Nom Sou
Montse 1250
Lluís 750
Jordi 1850
Eduard 3500


Condicions (if / choose)

Tenim dos tipus de condicions. Les simples (if) i les múltiples (choose).

Per la condició simple utilitzarem el següent contructor:

<xsl:if test="expressió">

</xsl:if>

Tot el que es trobi dins les etiquetes <xsl:if> i </xsl:if> només s'executarà quan es compleixi l'expressió que es trobi a test.

Per aplicar la condició test a diversos elements, de manera que només es mostrin els que compleixin la condició, el constructor <xsl:if> ha de trobar-se dins un element <xsl:for-each>.

El següent exemple mostra com enumerar en la llista únicament els empleats el sou dels quals sigui superior a 1500:

 <xsl:template match="/">
  <html>
   <body>
    <table border="1">
      <tr>
        <th>Nom</th>
        <th>Sou</th>
      </tr>
      <xsl:for-each select="empresa/departament/empleats">
       <xsl:if test="sou &gt; 1500">
         <tr>
           <td><xsl:value-of select="nom"/></td>
           <td><xsl:value-of select="sou"/></td>
         </tr>
       </xsl:if>
      </xsl:for-each>
    </table>
   </body>
  </html>
 </xsl:template>

Ens hem de fixar que al ficar la condició <xsl:if test="sou &gt; 1500"/>, en comptes de ficar el signe ">" hem possat el seu valor codificat &gt; d'aquesta manera ens assegurem que ho executem en el navegador que ho executem sempre funcionarà i que no ens ho agafarà com un inici o final d'una etiqueta (per el signe "<" hauríem d'utilitzar &lt;).

Per tant, en l'exemple anterior el resultat seria:

Nom Sou
Eduard 3500
Jordi 1850

Els operadors que pot utilitzar en una expressió test són els típics operadors condicionals:

  • < (menor que)
  • > (major que)
  • = (igual)
  • != (no igual)

Si es necessita comparar un valor amb una cadena, s'ha d'escriure la cadena entre cometes senzilles (per exemple, <xsl:if test="job = 'Programari Analyst'">).

També es poden definir condicions més complexes, de forma semblant al constructor IF-ELSE que s'utilitza en la majoria dels llenguatges de programació. La sintaxi no precisa cap explicació addicional:

<xsl:choose>
  <xsl:when test="expression">
       ...
  </xsl:when>
  <xsl:otherwise>
       ...
  </xsl:otherwise>
</xsl:choose>


Com s'ha vist fins ara amb altres constructors, per provar les condicions en diversos nodes XML, el constructor <xsl:choose> ha d'anidar-se en un bucle <xsl:for-each>.

L'element <xsl:otherwise> especifica les regles que s'han d'aplicar de forma predeterminada si el node XML no compleix la condició test inicial (les dels diferents <xsl:when> que utilitzem).

Imaginem que volem resaltar en verd els empleats que cobren més de 1500 i en gris els que cobren 1500 o menys:

 <xsl:template match="/">
  <html>
    <body>
       <table border="1">
       <tr>
         <th>Nom</th>
        <th>Sou</th>
      </tr>
      <xsl:for-each select="empresa/departament/empleats">
        <xsl:choose>
          <xsl:when test="sou > 1500">
              <tr bgcolor="green">
                   <td><xsl:value-of select="nom"/></td>
                   <td><xsl:value-of select="sou"/></td>
              </tr>
          </xsl:when>
          <xsl:otherwise>
              <tr bgcolor="grey">
                   <td><xsl:value-of select="nom"/></td>
                   <td><xsl:value-of select="sou"/></td>
              </tr>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:for-each>
     </table>
    </body>
  </html>
 </xsl:template>

El resultat seria semblant a:

Nom Sou
Eduard 3500
Montse 1250
Lluís 750
Jordi 1850

El constructor <xsl:choose> pot ampliar-se fàcilment per provar condicions múltiples si s'afegeixen un o més elements <xsl:when>. Independentment del nombre d'elements <xsl:when>, sempre ha de tenir un únic element <xsl:otherwise>, el qual s'encarrega de processar els casos que no compleixen les condicionis test inicials. Ho podem comprovar en el següent exemple on es veurà:

  • En groc els empleats amb un sou inferior a 1000
  • En gris els empleats amb un sou entre 1000 i 1500
  • En verd els empleats amb un sou superior a 1500



Vegeu També

Manual XPath

Manual XSLT

Exemples XSL



Enllaços externs