Introducció a l'XML
L'XML és un llenguatge de marques que ens permetrà estructurar, transformar, verificar, validar, consultar i emmagatzemar informació. La diferencia entre aquest llenguatge de marques i altres llenguatges de marca com l'HTML, és que aquest no té un conjunt predefinit de marques, sinó que les defineix l'usuari, i a més a més és el mateix usuari qui decideix quina semàntica està associada en cada marca. Per altra banda les marques del llenguatge HTML no tenen associada una semàntica sinó un manera de representar la informació. Per exemple:
Imatge
1
: Primer Exemple.
El codi HTML està orientat a ser interpretat pel navegador, un aplicatiu orientat a extreure un tipus concret d'informació, per exemple els noms de tots els personatges d'una novel·la, d'un document d'aquest tipus, es troba amb molts problemes. Problemes que a través de l'XML es poden solucionar fàcilment, ja que a cada etiqueta o marca s'hi pot associar un semàntica. Per altra banda, es important remarcar que les marques d'un document XML per si mateixes no tenen assignades una representació, per a poder definir la presentació d'un document XML cal fer servir altres tècniques, com ara les XSLT, XSLFO, CSS etc.
Una de les altre diferencies importants és que aquest llenguatge és molt més restrictiu que molts altres llenguatges de marques. A continuació es mostren algunes característiques d'aquest llenguatge que no necessàriament es donen en HTML:
·
Les marques són escollides per l'usuari. Per exemple "<biblioteca>","<disc>" etc.
·
Els elements poden tenir atributs. Per exemple "<disc preu="1000">".
·
Els elements sense dades es poden tancar al final de l'etiqueta. Per exemple "<disc></disc>" és equivalent a "<disc/>". No obstant en XML s'ha de posar una o l'altra opció, no és vàlid posar "<disc>" sense tancar l'element obert.
·
Els elements es poden aniuar. Per exemple:
"<disc> <autor>Pere</autor></disc>.
No obstant és incorrecte:
"<disc> <autor>Pere</disc>< autor >.
·
Els caràcters especials, com ara "&", es codifiquen a través de les entitats. Per exemple "&"à "&"
·
Les etiquetes d'obertura han de ser igual que les de tancament, distingeix les majúscules de les minúscules. Per exemple "<disc></Disc>" és incorrecte.
·
Els espais en blanc són normalitzats en els atributs, és a dir són eliminats, però no ho són en el contingut dels elements. Per exemple:
"<disc preu="1000 Pts"> <autor>Pere</autor></disc>.
Equival a:
"<disc preu="1000 Pts"> <autor> Pere</autor><disc>.
Quan un document XML no satisfà totes les restriccions que el llenguatge té especificades, es diu que el llenguatge no està ben format, en aquest cas fins que no ho estigui difícilment es podrà fer servir en algun aplicatiu.
Per altra banda, es poden definir altres tipus de restriccions lligades a un tipus concret de document XML, per exemple es pot definir quina és l'estructura dels documents XML que contenen la informació d'un llibre de la biblioteca de la Universitat Andorrana. La definició d'aquest tipus de restriccions es pot realitzar a través de les DTD o XML Schemas (XSD). És diu que un document XML és vàlid per a una definició concreta, si aquest document és validat per la DTD o XSD que conté la corresponent definició.
Les DTD i els XML Schemas
Tal i com ja s'ha dit, aquest dos llenguatges ens permetran definir l'estructura dels documents XML. Les DTD (Definició de tipus de document) és un llenguatge que va sortir als inicis de l'XML. Aquest presenta dos inconvenients principals: el primer és que no és llenguatge que tingui estructura de document XML, amb la qual cosa és difícilment extensible, i el segon és que té forces limitacions a l'hora de definir certs tipus de documents, per exemple no té tipus de dades per a restringir els valors dels documents, no hi poden haver elements amb igual nom i diferents valors etc.
Més recentment han sortit els XML Schemas, que són documents XML ben formats i que a més a més tenen una potència de restricció molt més elevada que les DTD, per exemple poden restringir que un atribut és de tipus enter i quin rang pot tenir. Tot i això, els XML Schemas ocupen molt més espai que les DTD i en alguns casos això pot ser un inconvenient.
A continuació es mostren algunes de les estructures bàsiques emprades en els XML Schemas per a definir els documents XML.
·
Es poden definir elements a través de la marca element. La sintaxi d'aquest element és la següent:
<xsd:element name="nom" type="tipus" minOccurs="int" maxOccurs="int"/>
Per exemple podem definir un element amb nom "Nom", de tipus cadena, que pot aparèixer de 0 a 1 vegades:
<xsd:element name="Nom" type="xsd:String" minOccurs="0" maxOccurs="1"/>
·
Es pot definir que un element està format per un llistat d'elements. Un de les sintaxis que es pot emprar pot ser:
<xsd:element name="Nom">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="nom" ./>
. .
</xsd:sequence>
</xsd:complexType>
</xsd:element>
Per exemple podem definir que un element amb nom "Persona", conté un nom i dos cognoms:
<xsd:element name="persona">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Nom" type="xsd:string"/>
<xsd:element name="Cognom" type="xsd:string"/>
<xsd:element name="Cognom" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
·
Es pot definir que un element està format per un element d'un llistat d'elements, és a dir expressar una tria. Un de les sintaxis que es pot emprar pot ser:
<xsd:element name="Nom">
<xsd:complexType>
<xsd:choise>
<xsd:element name="nom" ./>
. .
</xsd:choise >
</xsd:complexType>
</xsd:element>
·
Es pot declarar que un element conté definits un conjunt d'atributs. La sintaxi d'aquest element és la següent:
<xsd:element name="nom" type="tipus" minOccurs="int" maxOccurs="int">
<xsd:attribute name="name" type="simple-type" default/fixed="value"/>
.
</xsd:element>
On per exemple podem definir que l'element amb nom "Persona" té un atribut de tipus cadena "Nom" i dos atributs de tipus cadena "Cognom":
<xsd:element name="persona">
<xsd:complexType>
<xsd:attribute name="Nom" type="xsd:String"/>
<xsd:attribute name="Cognom" type="xsd:String"/>
<xsd:attribute name="Cognom" type="xsd:String"/>
</xsd:complexType>
</xsd:element>
La sintaxi dels XML Schemas és força extensa, en aquest apartat tan sols s'ha fet una breu pinzellada d'alguns dels seus aspectes, al final de la documentació es faciliten una sèrie de dades bibliogràfiques d'on es pot extreure abundant documentació dels XML Schemas.
Les fulles d'estil de transformacions
Les fulles d'estil de transformacions (XSLT) permeten realitzar transformacions sobre documents XML. Aquestes transformacions permeten, a partir d'un document XML, generar un nou document XML, o bé un document HTML, o bé un document de text pla etc. El document resultant d'aplicar el conjunt de transformacions pot contenir informació nova, informació extreta del document XML original o bé subconjunts del document original.
Les XSLT tracten el document XML com si fos una estructura arbòria, i apliquen les transformacions i seleccions sobre aquesta estructura.
Imatge
2
: Procés de transformació
Un fulla d'estil està formada per un conjunt de plantilles. Les dues parts més importants d'una plantilla són: l'expressió de selecció i el conjunt de transformacions. L'expressió selecciona sobre quina part del document XML s'aplica la plantilla que s'està definint. Aquesta selecció es realitza a través del llenguatge XPath. Cada transformació està formada per un conjunt d'instruccions que s'apliquen sobre la part de l'arbre XML seleccionat per el selector. Aquestes poden generar nova informació, cridar a altres plantilles etc.
Quan un processador d'XML rep una fulla d'estil i un document XML, el primer que fa és intentar aplicar la plantilla que selecciona el node arrel, en cas que no trobi la corresponent template aplica la plantilla per defecte, anomenada built-in. A partir d'aquest punt s'aplicaran unes o altres plantilles en funció de les diferents transformacions que s'executin.
A continuació es mostra un exemple d'XSLT, i quin és el resultat d'aplicar aquest fulla d'estil a un document XML concret. Partint el següent document XML:
|
<?xml version="1.0" encoding="UTF-8"?>
<?xml:stylesheet type="text/xsl" href="Empresa.xsl"?>
<Empresa>
<Treballadors> Francesc </Treballadors>
<Treballadors> Toni </Treballadors>
<Treballadors> Lluis </Treballadors>
<Treballadors> Pere </Treballadors>
</Empresa> |
Taula
1
: Document XML original.
S'hi aplica la següent fulla d'estil:
|
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="uri:xsl">>
<xsl:template match="/">
<html>
<head>
<title></title>
</head>
<body>
<xsl:for-each select="Empresa/Treballadors">
Treballador<b> <xsl:value-of select="."></xsl:value-of> </b><br/>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet> |
Taula
2
: XSLT que s'aplica
On hi ha definida una sola plantilla, la que realitza la selecció del node arrel, per tant la primera que s'executarà. Dins d'aquesta plantilla hi ha definits uns elements HTML, que com que no tenen definit el prefix "xsl", que identifica les instruccions de la fulla d'estil, seran part de la sortida que aquesta generarà. A més a més hi ha definida una instrucció de tipus for-each que selecciona tots els nodes de tipus "treballadors", fills de l'element "empresa", hi n'extreu el seu contingut. El resultat d'aplicar aquesta fulla d'estil és el següent:
|
<html>
<head><title></title></head>
<body>
Treballador<b>Francesc</b><br/>
Treballador<b>Toni</b><br/>
Treballador<b>Lluis</b><br/>
Treballador<b>Tomas</b><br/>
</body>
</html> |
Taula
3
: Resultat de la transformació.