1 Curs Programació en XMLXSL The eXtensible Stylesheet Language Family
2 eXtensible Stylesheet Language (XSL)XSL és una família de llenguatges que permet descriure com formatar o transformar els documents XML. Hi ha tres llenguatges XSL: XSL Transformations (XSLT) XSL Formating Objects (XSL-FO) XML Path (XPath) Aquests estàndards es troben sota els auspicis del consorci W3C i estan basats en XML. XSL-FO també era conegut com XSL.
3 La família XSL XSL Transformations (XSLT)S'utilitza per transformar documents XML. XML Path (XPath) S'utilitza per adreçar porcions dels documents XML. XSLT fa un ús extensiu de XPath. És un Query Language i és l'únic no basat en XML. XSL Formating Objects (XSL-FO) S'utilitza per formatejar els docs XML. Pot definir els layouts, coloració, tipografia, etc. El seu rol és similar al de CSS però és més potent.
4 XSL Transformations (XSLT)
5 eXtensible Stylesheet Language Transformations (XSLT)Les fulles d’estil XSLT permeten processar els documents XML i transformar-los en altres tipus de documents amb l'ajuda de XPath. Documents text Documents HTML Altres documents XML (Convertir d'un XML Schema a un altre). P.e. XHTML. Permet Transformar i generar la presentació adequada de documents XML en navegadors. Reusar o extreure informació de documents XML. Generar documents PDF a partir de XML (XSL-FO)
6 Historia de XSLT
7 XSLT com a llenguatge de programacióLes fulles d’estil estan programades en XML. L'estil de programació és ben diferent al dels llenguatges procedimentals com C, C++ o Java. S'utilitza un estil de programació declarativa utilitzat en llenguatges funcionals com LISP, AWK o Scheme: No hi ha efectes secundaris. Una instrucció fa el mateix sigui quin sigui el camí que ens hi ha dut. És a dir, no hi ha variables globals, ni bucles amb variables incrementals o amb test de fi de bucle. S'utilitza recursivitat en comptes d'iteracions. La programació es basa en regles: si succeïx un esdeveniment a l'entrada, s'executa una acció a la sortida.
8 XSLT com a llenguatge de programacióLes fulles XSLT estan formades per un conjunt de regles que defineixen un conjunt de sentències que s’han d’aplicar quan es tractin nodes d’un tipus determinat. Cada una d’aquestes regles s’anomenen templates (plantilles). Per exemple podem definir una plantilla que s’aplica sobre els nodes de tipus producte. S'utilitza un processador XSLT per processar totes les regles del XSLT sobre un document XML i obtenir un document resultat.
9 XSL Transformations (XSLT)Arbre XSLT Fitxer sortida Pot ser un fitxer XML, HTML o text Fitxer d'entrada Ha de ser un fitxer XML Processador XSLT Arbre Font Arbre Font SOURCE TREE RESULT TREE ARBOLES--> DOM! Arbre resultant
10 eXtensible Stylesheet Language (XSL)Referències sobre XSL al W3C: (XSL-FO 1.0)
11 Primer Exemple XSLT botiga.xml botiga-html.xsl FIREFOX
10 11 12 13
12 Exemple Didàctic XSLT. El JardinerPodríem pensar en una fulla d'estils XSLT com un jardiner que va podant arbres partint de la seva arrel. A l'arribar a una branca (node) executa una acció: la poda, insereix un altre branca, la modifica, o simplement la deixa igual; l'arbre és realment l'arbre DOM del document XML.
13 Fulles d'estil explícitesL'atribut version és obligatori! Declaració de l'espai de noms XSLT Element arrel de la fulla d'estils Declaració XML Control de la sortida (element output) Expressió XPath Top Level elements Literal Result element Template Instrucció XSLT Result Tree Template
14 Fulles d'estil ImplícitesL'element arrel no és el de la fulla d'estil. La fulla d'estil per defecte no és XSLT si no la del format resultant: Full d'estils XSLT Element arrel html
15 Algoritme de processament XSLTEs crea l'arbre de nodes del document XSLT segons XPATH. En aquest moment el processador XSLT comprova la sintaxi, executa els imports, etc. Es fa el mateix per al document d'entrada. Es carregen les plantilles per defecte (Built-In Templates). Es processa el node arrel. Si cap plantilla coincideix amb el node arrel s'apliquen les plantilles per defecte. El procés es repeteix tenint en compte els possibles conflictes entre plantilles.
16 Algoritme de processament XSLTPlantilles per defecte Plantilla que fa que es continuï processant el següent node en cas que no hi hagi cap plantilla coincident El mateix per a Modes
17 Algoritme de processament XSLTNodes de text i atributs es copien directament a la sortida Els comentaris i les instruccions de processament s'ignoren Referència XSLT:
18 Algoritme de processament XSLTEs pot trobar informació en més detall sobre l'algoritme de processament XSLT a: Wikipedia
19 Processadors XSLT Hi ha múltiples processadors XSLT, tant programari lliure com propietari. Les últimes versions dels navegadors (P.ex. Firefox) incorporen un processador XSLT. Els entorns de desenvolupament integrat com Eclipse també incorporen processadors XSLT. Podem destacar dos: Xalan
20 Estructura XSLT XSLT és XML i per tant ha de tenir la declaració XML.Els nodes arrels vàlids són stylesheet o transform. És obligatori especificar el paràmetre versió (1.0 o 2.0). Millor declarar l'espai de noms:
21 L'element arrel stylesheet (transform)La sintaxi és: Com a fills només pot tenir Top Level Elements (i en cas d'utilitzar imports han d'estar a l'inici) Referència XSLT:
22 Tipus d’elements d’un XSLTXSLT té dos tipus d’elements: TOP-LEVEL: són elements fills del node arrel XSLT. INSTRUCTION: elements que tenen associades accions sobre nodes. Aquests són els que aniran generant el document de sortida i processant el document d’entrada.
23 Top-level elements Poden aparèixer en qualsevol ordre (programació declarativa i no procedimental!), exceptuant els nodes xsl:import, que han d’anar a l'inici. Els elements que poden aparèixer en aquest nivell es poden dividir en tres grans categories: Elements propis de l’estàndard XSLT. Elements definits pel processador de les fulles d’estil. Aquests poden facilitar funcionalitats que no es troben definides a l’estàndard. Elements definits per l’usuari. Aquests són elements que seran ignorats pel processador, però que poden ser usats com a fonts de dades per la pròpia XSLT.
24 Top-level elements: Estàndard
25 Element Template Aquest element ens permet definir les regles o transformacions que volem aplicar als fragments de l’XML. Aquestes regles s’apliquen quan el processador d’XSLT troba el patró que la plantilla defineix. Ens permeten: Fer conversions a text Generar nous elements XML Crear nous continguts Crear nous atributs Consultar continguts Els elements que es troben dins l’element template són de tres tipus diferents: Instruction elements Extension elements Elements de sortida literals (literal result elements)
26 XSL Instruction Elements
27 Literal Result ElementsAquests elements no tenen cap acció associada, formen part del document que es genera. Tal i com són llegits són escrits a la sortida. No es realitza cap procés associat a aquests elements. Referència XSLT:
28 XSL Extension ElementsAquests elements són elements que no pertanyen a l'estàndard XSL, faciliten altres funcionalitats, com per exemple guardar un context en diferents documents XML. Per usar-los cal declarar al node stylesheet, o a l'element que és una extensió, l’atribut xsl:extension- element-prefixes i facilitar el llistat de prefixos que s’usen per a declarar que un element és una extensió d’un tipus particular. Referència XSLT:
29 Descripció Top Elements principalsEn aquest apartat s'aprofundeix en els top elements més importants
30 Sortida dels XSLT: element outputPermet especificar les característiques de la sortida version: (per defecte 1.0) encoding: especifiquem amb quin joc de caràcters generem la sortida. Generació de la declaració XML: Es genera per defecte si el mètode de sortida és xml. Amb l’atribut omit-xml-declaration podem controlar la generació de la declaració XML
31 Sortida dels XSLT: element outputstandalone: amb aquest atribut controlem si el fitxer XML generat té una DTD associada o no. doctype-system: Especifica la DTD. doctype-public: Especifica l'identificador públic de la DTD. indent: Especifica un format de sortida indentat que és més llegible. cdata-section-elements: Identifica quins elements tenen contingut de tipus CDATA. Referència XSLT:
32 Element Template Aquest element ens permet definir les regles o transformacions que volem aplicar als fragments de l’XML. Aquestes regles s’apliquen quan el processador d’XSLT troba el patró que la plantilla defineix. Ens permeten: Fer conversions a text Generar nous elements XML Crear nous continguts Crear nous atributs Consultar continguts Els elements que es troben dins l’element template són de tres tipus diferents: Instruction elements Extension elements Elements de sortida literals (literal result elements)
33 Atributs de l’element TemplateL’element template conté els següents atributs: match: atribut opcional que conté el patró que determina quins nodes són elegibles per a ser processats. Utilitza el llenguatge XPath. name: atribut opcional que identifica la plantilla. En aquest cas podrem invocar la plantilla directament. Al menys un dels dos atributs és obligatori. Named Template: Es pot fer l'analogia amb les funcions o procediments dels llenguatges estructurats. Referència XSLT:http://www.w3.org/TR/xslt#named- templates
34 Atributs de l’element Template (II)priority: aquest atribut és opcional i ens permet assignar una prioritat a la plantilla. En cas que hi hagi més d’una plantilla possible a ser aplicada s’aplica la que té més prioritat. mode: aquest atribut, també opcional, permet assignar un mode a una plantilla. D’aquesta manera quan es fa un apply-template sobre un node es pot demanar que la plantilla que s’apliqui sigui d’un mode concret.
35 Creació de l'arbre resultantEn aquest apartat explicarem els elements que permeten crear nodes d'arbre resultant (Result Tree).
36 Elements Principals Els elements més importants en la creació de l'arbre resultant són: apply-templates value-of element attribute attribute-set text comment processing-instruction També hem de tenir en compte els Literal Results Elements. Referència XSLT:
37 L' Element apply-templatesEns permetrà aplicar una plantilla a un node o conjunt de nodes. La sintaxi és la següent: Algorisme Per cada node que compleixi l'expressió del paràmetre select, busca si hi ha definida alguna plantilla coincident: Si està definida: aplica la plantilla sobre el node definit. Si no està definida: mostrarà el contingut dels nodes o aplicarà les plantilles per defecte Referència XSLT:
38
39 L' Element element Hem vist que podem crear tags amb Literal Results Elements: No obstant podem utilitzar l’element element: Aquest element té d'entre d'altres la utilitat de crear elements de forma dinàmica mitjançant variables, estructures de control, etc. Referència XSLT:
40
41
42 L' Element attribute-setElement fill del node stylesheet (és per tant un top- level element) que permet definir un conjunt d’atributs que es poden reutilitzar en un document XSLT. Referència XSLT:
43 L' Element text Element que s'utilitza per generar text. Podem generar el codi següent: A través dels següents elements: Si l’atribut disable-output-escaping val “yes” llavors el processador del XSLT traduirà els caràcters especials. P.e. “<” a “&” Referència XSLT: tenda :
44 L' Element comment Per a generar comentaris farem servir el tag
45 L' Element processing-intructionEns permet crear instruccions de processament El processador ens generarà la següent sortida: Referència XSLT:
46 Named Templates Normalment els elements template contenen elements de tipus instrucció. Ara bé, hi podem trobar altres elements com: xsl:param. Ens permet definir els paràmetres que tindrà la plantilla. xsl:variable. Ens permet definir variables que podem emprar dins les expressions i patrons. Referència XSLT:
47 L’element xsl:param Aquest element ens permetrà definir paràmetres que es podran passar a la plantilla quan sigui invocada (en el cas que sigui invocada directament a través d’un apply-templates). La seva estructura és del tipus: On: name és el nom del paràmetre. select és l’expressió que assigna un valor defecte al paràmetre.
48 L’element xsl:variableAquest element permet definir variables dins d’una plantilla. Ara bé, el valor de la variable només es pot assignar una vegada, durant la seva declaració. La sintaxi de la declaració és:
49 Estructures de controlEn aquest apartat treballarem mecanismes que ens permeten fer un tractament d’XMLs més complex de forma similar a les estructures de control dels llenguatges de programació estructurats.
50 Estructura for-each Ens permetrà tractar col·leccions de nodes.La sintaxi d’un for-each: La semàntica: per cada node XML resultant de la selecció a través del select (1) aplica-hi les instruccions i plantilles corresponents (2).
51 Estructures condicionalsEn aquest apartat s’expliquen les estructures condicionals de XSLT.
52 Estructura if Dins la XSLT podem posar estructures condicionals tipus IF. El seu format és el següent: On, si l’expressió XPath és certa s’avaluen les sentències XSL de l'interior de l'element xsl:if.
53 Estructura Choose Per expressar les estructures condicionals que amb Java, C++, etc. són: If(condicio) { codi} else if (condicio) {codi} .. Amb XSLT ho fem a través de l’element xsl:choose: On les condicions són expressions que han de ser booleanes i els Blocs són elements XSLT.
54 Sort S'utilitza per ordenar Strings o nombres: Referència XSLT
55 Sort Exemple
56 Combinació de fulles d'estilHi han dos mètodes per combinar múltiples fulles d'estil: Inclusió: És combinen les fulles sense prioritats - Importació: La fulla d'estils que importa sobreescriu les plantilles Es pot utilitzar
57 En aquest apartat parlarem sobre XPath ambXML Path (XPath) En aquest apartat parlarem sobre XPath amb més profunditat
58 XPath És l'encarregat d'adreçar porcions de codi XML.És l'únic llenguatge de la família XSL que no està basat en XML. Inicialment va ser creat per interactuar entre XSL i XPointer, però ràpidament va esdevenir el llenguatge de consultes per XML. Es podria dir que XPath és a XML el que SQL és a les bases de dades relacionals.
59 XPath XPath defineix un conjunt de set tipus de nodes posibles:El node arrel Els nodes elements Els nodes texts Els nodes atributs Els nodes d’espais de noms Els nodes d’instruccions de processament Els nodes comentaris Referència Xpath:
60 Processing intructionTipus de nodes XPath
61 El node actual o node contextSempre que ens adrecem o seleccionem un node passa a ser el node context o node actual. P. ex.: En aquest exemple anterior, el node context és el node tienda.
62 Camins (Paths) De forma similar al path d'un fitxer, en XPath utilitzem camins per indicar la situació d'un node o conjunt de nodes dins l'arbre d'un document XML. Concretament XPath ho anomena “camí de localització” (Location Path) o patrons. Els valors dels camps match i select contenen expresions Xpaths. Concretant: Els atributs del tipus match contenen patrons . Els atributs del tipus select contenen expressions. Conjunt de nodes: No tenen per que ser correlaitus. Es pot per exemple escollir tots els atributs.
63 Location Paths (Patrons)Són un subconjunt de les expressions Dues formes d'expressar les Location Paths Sintaxi expandida Sintaxi abreviada Molt similar a les URIS o els sistemes de fitxers Dos tipus Absolutes: Comencen amb el caràcter “/” Relatives Estan formades per Location Steps. Cada pas està separat pel caràcter “/” (similar als sistemes de fitxers) Referència XSLT:
64 Location Paths Estructura Location PathsAxis::NodeTest[Predicate]/Axis::NodeTest[Predicate]/... Expressions Location Path Location Steps Axes Node Tests Predicates
65 Location Steps Estan formades per tres partsUn axis. Especifica la relació en l'arbre XML entre els nodes seleccionats i el node de context. Un node test. Especifica el tipus de node i el seu nom. Zero o més predicats. Utilitzen expressions per refinar el conjunt de nodes seleccionats. Referència XSLT:
66 Axis Els axis possibles són: child self ascestor-or-self parentattribute descendant descendant-or-self - ancestor ascestor-or-self following preceding following-sibling preceding-sibling namespace Referència XSLT:
67 // és l'axis descendant-or-self.Sintaxi Abreviada Es pot utilitzar una sintaxi abreviada per alguns dels Axis: child. És l'axis per defecte. El . és l'axis self. Els .. (dos punts) són l'axis parent. @attribute_name és la sintaxi abreviada de attribute::. // és l'axis descendant-or-self.
68 Node Tests Les opcions són: Referència XSLT:* node() text() namespace:* namespace:node comment() processing-instruction() processing-instruction(literal) Referència XSLT:
69 Predicates Els predicats són opcionals i van entre els caràcters []S'utilitzen per refinar el conjunt de nodes seleccionats (P.ex. escollir l'últim, l'n-èsim, el primer, etc.) Referència XSLT:
70 Expressions XPath El valor de l’atribut select del node apply- templates ha de contenir una expressió. Les expressions també es fan servir als elements: for-each, param, sort, value-of, etc. Una expressió pot contenir qualsevol Location Path, ja que aquest darrer és un subconjunt de les expressions. Referència XSLT: Expressions
71 Expressions XPath (II)Funcionalitats: Podem usar nombres: Podem emprar strings: “cadena”. Podem utilitzar qualsevol Location Path. Podem usar operacions: +,- , -99, *, div i mod Podem usar operacions booleanes: or, and, “=“ igualtat, “!=“ diferencia, “<” mes petit que, “>” mes gran, “<=“mes petit igual, “>=“ mes gran o igual. Podem utilitzar variables $nomVariable Podem cridar funcions Funcio()
72 Funcions XPath XPath defineix 4 grups de funcions Node Set FunctionsString Functions Boolean Functions Number Functions Referència XPath:
73 Node Set Functions Operacions amb nodes Referència XSLT: number last()number position() number count(node-set) node-set id(object) string local-name(node-set?) string namespace-uri(node-set?) string name(node-set?) Referència XSLT:
74 String Functions Operacions amb strings: string string(object?)string concat(string, string, string*) boolean starts-with(string, string) boolean contains(string, string) string substring-before(string, string) string substring-after(string, string) string substring(string, number, number?) string normalize-space(string?) string translate(string, string, string) Referència XSLT
75 boolean boolean(object) boolean not(boolean) boolean true() Boolean Functions Operacions amb booleans boolean boolean(object) boolean not(boolean) boolean true() boolean false() boolean lang(string) Referència XSLT:
76 Operacions amb nombresNumber Functions Operacions amb nombres number number(object?) number sum(node-set) number floor(number) number ceiling(number) number round(number) Referència XSLT:
77 Resolució de conflictes entre plantillesDos conceptes ens permeten resoldre els conflictes en cas de tenir més d'una plantilla coincident: IMPORT_PRECEDENCE. Els documents XSLT poden tenir annexes mitjançant imports. Quan més profund és l'import menys prioritat tenen les seves plantilles. PRIORITY. Si dues plantilles coincideixen per un mateix mode el processador ha d'utilitzar el que tingui la prioritat més alta. En cas que no es resolgui el conflicte el processador escollira la plantilla que s'hagi especificat més tard en la fulla d'estils. Referència XSLT: Tecnicament és un error tenir dos plantilles que coincideixen en un mateix node amb la mateixa prioritat. Tot i això la majoria de processadors obvien aquest error i el que fan és executar la plantilla que s'ha especificat més tard. Bona conducta--> Utilitzar priority
78 Prioritat Prioritat explícita: Les plantilles tenen un atribut anomenat priority. Prioritat per defecte: Quan menys específic menys prioritat: Patrons XPath com * o altres comodins tenen la prioritat mínima de -0,5. Patrons que especifiquin nodes segons el seu nom (node1) tenen prioritat 0. Patrons que tenen en compte el context (node_pare/node1) tenen la prioritat per defecte màxima 0,5. Cal destacar que quan s'assignen prioritats per defecte no importa com d'específic es sigui a l'hora de definir el context perquè la prioritat sempre serà 0,5. D'aquesta manera c/b/a té la mateixa prioritat que b/a.
79 Pull vs Pull Hi han dos estils principals a l'hora de crear fulles d'estil XSLT: Estil PUSH El document XML és “empès” cap a la fulla d'estil. S'utilitzen més plantilles S'utilitza l'element xsl:apply-templates com a control del flux de la fulla d'estil Òptim per documents XML orientats a documents (l'estructura del document origen és més desconeguda a priori) Documents
80 Pull vs Pull (I) Estil PULLLa fulla d'estil “recull” la informació del document XML original per tal d'omplir una plantilla predefinida. S'utilitzen menys plantilles. S'utilitzen elements de control de flux (xsl:for-each) i és seleccionen els elements amb xsl:value-of. L'estructura del document final esta més determinada per la fulla d'estil. Òptim per documents XML orientats a dades (l'estructura del document origen és més coneguda) Dades
81 XSLT 2.0 Els Fragments del Arbre Resultant s'han convertit a node-sets. És pot explicitar més d'un document resultant. Suport de serie per treballar amb grups. Funcions definides pels usuaris. Evidentment les millores de XPath 2.0 són aplicables a XSLT 2.0.
82 XPath 2.0 Incorpora els requeriments de XQuery.Subconjunt comú entre XSLT i XQuery. XPath 2.0 va més enllà que un llenguatge de consulta (no és la funció de XQuery). XPath 2.0, suporta tots els tipus de dades que suporta XSD (19 tipus nous afegits respecte 1.0). P. ex. dates. S'han afegit funcions de suport a aquest tipus de dades. Seqüències