Академический Документы
Профессиональный Документы
Культура Документы
XML ?
2
XML (Extensible Markup Language) est un mtalangage de description et dchange de donnes entre applications. Ce langage permet de sparer le contenu, la structure et la prsentation dun document. XML a lambition de devenir le format dchange universel de donnes intra et interentreprises. Comme HTML, XML est un langage qui prsente linformation encadre par des balises. XML est un langage pour mmoriser des donnes structures dans un fichier texte. XML est une famille de technologies. XML est libre de droits, indpendant des platesformes.
dveloppement de systmes dinformation ; graphisme et multimdia ; administration et gestion de contenu ; communication, synthse et reconnaissance vocale ; marketing One-to-One et personnalisation ; gestion lectronique de documents et portail dinformation dentreprises ; intgration dapplications dentreprise ; commerce lectronique et EDI.
les faiblesses du langage HTML ; la faible diffusion de SGML (lanctre de XML qui sest avr trop complexe mettre en oeuvre) ; les limites du modle client-serveur : protocoles non portables, extensions propritaires, donnes non compatibles ; le dveloppement du modle 3 couches : li internet et aux architectures web ; les besoins dun mtalangage : extensible tous les besoins, offrant un format dchanges de donnes entre applications, sparant la description et la prsentation, tolrant les changements de contenu et indpendant de la plate-forme.
Remarques
5
XML fournit une syntaxe, pas de smantique a priori Les balises n'ont pas de prsentation ou de signification dfinie par le langage mais elles peuvent bien sr avoir un sens pour les applications
<nom>jean</nom> <matire>jean</matire>
XML ne dfinit que la structure et le contenu d'un document, pas son comportement ni son traitement
Remarques
6
Industriels: tous les poids lourds, notamment Oracle, IBM, Compaq, Xerox, Microsoft, etc.. Laboratoires de recherche: MIT (reprsentant les US), INRIA (Europe), universit Keio au Japon (Asie)
Les mmes donnes (avec diffrentes feuilles de style) disponibles pour de nombreux supports (pc, pda) et de nombreuses applications
Les documents doivent tre bien forms mais le typage ( valide ) nest pas obligatoire
XSL/T, [Xquery]: transformation et requtes XPATH: chemins XLink: liens entre documents DOM: Application programing interface SOAP: distributed computing [WebDAV]: distributed authoring and versioning Plus des tas dautres et de logiciels
Un ensemble prdfini et limit de balises surtout de prsentation, dfini par une norme (HTML 2.0, 3.2, 4.0).
Tim Berners-Lee (le crateur de HTML) a luimme prch pour un successeur. Pourquoi?
Exemple de html
L'affichage d'un document est fortement dpendant de l'interprtation qu'en fait le navigateur Il est ncessaire de disposer de plusieurs versions du document en fonction du mdia de rendu L'indexation de documents ne peut se faire que sur la partie textuelle Document et pas donne
Il fallait passer dun de balisage de prsentation un BALISAGE STRUCTUREL XML comme SGML dont il est un descendant utilisent un balisage structurel SGML : Standardized Generalized Markup Language
Trs utilis en documentation technique Airbus: la doc doit tre prcise et non ambigu SGML + vocabulaire contrl: ontologie
SGML norme ISO 8879:1986 Trs utilis dans l'industrie pour de grandes documentations techniques. Trop complexe pour une utilisation grand public ou dans des domaines moins exigeants sur la prcision SGML: trop de trucs compliqus et inutiles XML utilise 10% de SGML pour reprsenter efficacement la plupart des besoins des applications
Exemple de document
13
WindStar 2000 Les rosires en buget AB562 Saint Ptaouchnoque Tel: 012133564 Fax: 879765426
Logo
Date
Destinataire
Formule de politesse
Monsieur, Bla bla bli, bli blo bla, kkkk vhlg vckjdhklbg fdskjbvhv feje slc ifehfe fhckh c jeflccj n khef iheznf jkvbc lkhdklvn v
Corps
Pied de page
Signature
Pied de page
Reprsentation XML
<lettre> 14 <entete> <logo loc="logo-graph.vml"/> <adresse> &abrev-adresse; </adresse> </entete> <destinataire> <nom> Mr Schnock </nom> <adresse> <rue> rue des glantiers </rue> <ville> Saint Glin </ville> </adresse> </destinataire> <objet> bla bla </objet> <date> 30 Nivose 2004 </date> <salutation> Monsieur, </salutation>
<corps> <para> Ici le premier paragraphe </para> <para> et l le deuxime </para> </corps>
</lettre>
Points importants
15
La reprsentation de cette lettre en XML ne comporte aucune indication sur sa mise en page
Les aspects graphiques ou typographiques sont absentes du source XML Ces aspects seront dfinis par l'intermdiaire d'une feuille de style
Une feuille de style est un ensemble de rgles pour spcifier la ralisation concrte d'un document sur un mdia particulier
Si lettre alors enfants Si entete alors Si corps alors enfants para Si para alors
Police new roman, taille 12, dcaler premire ligne
Si alors
Editions Duschmol, 12 rue Schmurz YT123 Rapis Objet: ben quoi? Monsieur, Bla bla bli, bli blo bla, kkkk vhlg vckjdhklbg fdskjbvhv feje slc ifehfe fhckh c jeflccj n khef iheznf jkvbc lkhdklvn v Veuillez agrer patati patata vachement sincres. signature
Pied de page
Intrt
Syntaxe
plus rigoureuse Importation de fragments de documents d'autres domaines nominaux Possibilit d'utiliser les applications XML standard
Permettre l'change et le traitement d'expressions mathmatiques sur le Web Insertion aise d'expressions mathmatiques dans des documents HTML ou XML Communication d'expressions entre applications au plan smantique
Recommandation du 04/09/2001
Simple Object Access Protocol SOAP 1.1 : soumission au W3C du 08/05/2000 Protocole d'change de donnes entre applications distantes Adapt pour tre utilis au-dessus du protocole HTTP (mthode POST) Structure d'un message SOAP
Exemple
22
<evp:Envelope xmlns:evp='http://schemas.xmlsoap.org/soap/envelope/' evp:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'> <evp:Header> <t:Transaction xmlns:t='http://stock.org/registry/updPriceList/'> evp:mustUnderstand='1'> 5 </t:Transaction> </evp:Header> <evp:Body> <m:GetLastTradePrice xmlns:'http://stock.org/registry/updPriceList'> <symbol>DEF</symbol> <company>DEF Corp</company> </m:GetLastTradePrice> </evp:Body> </evp:envelop>
23
Avantages de XML
En XML, une communaut d'auteurs invente librement les balises qui lui paraissent utiles pour reprsenter les informations quils comptent changer ou partager Exemple: diverses faons de reprsenter une date
<date> 5 Janvier 2000 </date> <date> <a>2000</a><m>01</m><j>05</j> </date> <date format='ISO-8601'> 2000-01-05 </date>
Exemples
Commandes en commerce lectronique ou toute transaction Publication et recherche dinformation dans un domaine industriel comme lindustrie des biotechnologies
Consquences:
Un
serveur de documents XML est susceptible de rpondre l'ensemble des besoins d'une organisation. Un seul diteur permet de traiter l'ensemble des donnes d'une organisation.
Modularit et rutilisation
26
Chaque utilisateur est libre de dfinir ses propres structures de document Il peut aussi se conformer des structures types, appeles DTD Chaque communaut peut ainsi proposer des structures normalises La conformit une DTD permet l'automatisation des traitements et assure une possibilit de contrle de validit
L'interrogation et l'change de donnes entre systmes d'information htrognes est souvent complexe XML contribue rsoudre ce problme
28
29
Tout document XML se compose : dun prologue, dont la prsence est facultative mais conseille. Il contiendra un certain nombre de dclarations. dun arbre dlments. Il forme le contenu du document. de commentaires et dinstructions de traitement, dont la prsence est facultative. Ils pourront, moyennant certaines restrictions, apparatre aussi bien dans le prologue que dans larbre dlments.
Le prologue
30
Il peut contenir une dclaration XML, des instructions de traitement et une dclaration de type de document. Dclaration XML Syntaxe : <?xml version=1.0 encoding=ISO-8859-1 standalone=yes ?> Elle indique au programme qui va traiter le document : la version du langage XML utilise le codage de caractres utilis dans le document ; par dfaut ISO 10646 mais le programme doit pouvoir traiter aussi lUTF-8 et lUTF-16. lexistence ou non de dclarations extrieures au document qui doivent tre prise en compte pour le traitement de celui-ci. La dclaration est facultative mais fortement conseille. Chacune des trois informations est elle aussi facultative mais si elles apparaissent cest obligatoirement dans cet ordre.
Instructions de traitement
31
Elles sont facultatives et ne font pas, strictement parler, partie du document. Leur contenu est simplement transmis une application en vue de dclencher certains traitements.
32
La dclaration de type de document indique, le cas chant, la DTD laquelle se conforme le document. Elle permet aussi de spcifier certaines dclarations propres au document. Syntaxe : <!DOCTYPE nom_type [ dclarations ]>
nom_type est un nom choisi arbitrairement et qui sert indiquer la porte des dclarations dfinies entre crochets. Elles seront valides pour tout document dont llment racine sera du type nom_type.
Notons que la dclaration de type de document : est obligatoire pour les documents valides (se conformant une DTD). est obligatoire lorsque lauteur veut inclure des dclarations spcifique aux documents, que ceux ci se conforment ou non une DTD.
DTD - Exemple
33
Larbre dlment
34
un ou plusieurs autres lments. On parlera dlment pre et dlment fils. En fait la partie essentielle dun document XML sera toujours forme dune hirarchie dlments qui dnote la smantique de son contenu : cest larbre dlment. Dans un document XML il nexiste quun et un seul lment pre, llment racine, qui contient tous les autres.
Exemple
35
Les commentaires
36
Des commentaires peuvent tre insrs dans les documents. Ils sont encadrs pas les marques de dbut <!-- et de fin --> de commentaire. Syntaxe : <!-- commentaire --> Le corps du commentaire peut contenir nimporte quel caractre lexception de la chane --. On ne peut donc pas inclure un commentaire dans un autre. Le commentaire ne peut pas non plus tre inclus lintrieur dune balise.
Elments et attributs
37
Les balises Tout document XML doit comporter une racine. En fait, la premire paire de balises d'un document XML sera considr comme la balise de racine [root]. Par exemple :
<racine> ... suite du document XML ... </racine>
Si on ose faire un lien avec le Html, votre lment racine tait <body> ... </body>. Tous les autres lments seront imbriqus entre ces balises de racine. Par exemple :
<parents> <enfants> <petits_enfants> ... </petits_enfants> </enfants> </parents>
Balises (suit)
38
Les balises doivent tre correctement imbriques. Chaque lment dun document XML se compose dune balise douverture, dun contenu dlment et dune balise de fermeture. Syntaxe : <nom>contenu_lment</nom> La balise douverture dun lment peut inclure des attributs sous la forme de paires nom=valeur Les valeurs des attributs doivent toujours tre mises entre des guillemets. Exemple : <personne id="394563-M">Martin</personne> Notons quune syntaxe simplifie existe pour les lments vides : <nom/> <personne id="394563-M" /> Il est interdit en XML de faire chevaucher des balises, c'est--dire d'avoir une succession de balises du type: <balise1> <balise2> </balise1> </balise2>
le nom des lments est compos de caractres alphanumriques, de lunderscore _, du signe moins ou du point .. Le caractre deux-points : est autoris mais il a une signification particulire. De plus le premier caractre doit obligatoirement tre alphabtique ou un underscore. ce nom ne doit pas contenir despacement ou de fin de ligne. aucun nom ne peut commencer par la chane xml (casse indiffrente). la valeur dun attribut est une chane de caractre encadrs par des apostrophes ' ou par des guillemets ". Elle ne doit pas contenir les caractres ^%&.
XML fait une distinction entre majuscule et minuscule, ce qui fait que les balises <Nom>, <nom> et <NOM> ne sont pas quivalentes. Bien que pouvant tre arbitrairement choisis, les noms dlments sont en gnral en rapport avec le contenu quils encadrent
Les attributs
41
Il ny a pas vraiment de rgle quant au choix entre un document utilisant uniquement des lments sans attribut et un autre utilisant des lments avec attributs.
<liste> <personne prenom=Anne nom=Martin> <adresse rue=rue de Mandur ville=Rouen /> </personne> <personne prenom=Gaelle nom=Martin> <adresse rue=rue de Mandur ville=Rouen /> </personne> </liste>
<liste> <personne> <prenom>Anne</prenom> <nom>Martin</nom> <adresse> <rue>rue de Mandur</rue> <ville>Rouen</ville> </adresse> </personne>
</liste>
Un lment peut contenir dautres lments, des donnes, des rfrences des entits, des sections littrales et des instructions de traitement. Un lment peut avoir un contenu rcursif, cest dire quil peut contenir une instance du mme type dlment que lui-mme. Les donnes des lments peuvent contenir tous les caractres autoriss sauf le et commercial & et le infrieur <.
43
Un auteur peut vouloir insrer un caractre non disponible sur sa plate-forme ou son clavier. Il utilise pour cela le numro du caractre dans les tables ISO 10646 ou Unicode. Ce numro sera prcd des caractres &# puis suivi dun point virgule ;. Le numro peut tre donn en dcimal ou en hexadcimal (dans ce cas on le prfixe par &#x). Par exemple & ou ≧ correspond au caractre et commercial &.
44
Il existe quelques entits prdfinies afin de faciliter leur insertion dans un document XML. Il sagit notamment des caractres <, >, &, et " < < > > & & ' " "
45
Il est galement possible de dfinir ses propres entits et dy faire rfrence dans le contenu des lments. Cette dfinition se fait dans la partie dclaration du DOCTYPE :
<!DOCTYPE nom_type [ <!ENTITY nom_entit "valeur_remplacement"> ]>
Exemple :
<!DOCTYPE test [ <!ENTITY asi "Département ASI"> ]>
Section littrale
46
Lorsque lon dsire insrer une chane contenant beaucoup de caractres spciaux il est prfrable dutiliser le marqueur de section littrale <![CDATA []]> Exemple :
<p>Entité littérale <![CDATA [<dep>Département ASI</dep>]]></p>
Entits et notations
47
Le mcanisme des entits ne se limite pas aux lments prdfinis ou aux lments dfinis en interne. On peut distinguer les entits selon quelle sont internes ou externes au document qui les utilise. On peut aussi distinguer les entits qui contiennent un document ou un fragment de document XML bien form, de celle qui contiennent des donnes non XML (images, graphiques, sons,). Notons que des entits contenant des donnes non XML seront obligatoirement des entits
48
Ce type dentit permet, par exemple, de fragmenter un document XML en plusieurs sous-documents. Ceux-ci peuvent alors tre utiliss dans plusieurs documents distincts. Syntaxe : <!ENTITY nom SYSTEM url> On utilise le mot-clef SYSTEM suivi de l'URL o se trouve l'entit. Cette URL peut tre donne en relatif ou en absolu. Les URL passes en absolu peuvent faire appel l'un des protocoles rseaux utiliss couramment sur l'Internet (http://, ftp://, ...). Comme pour toute entit, les rfrences externes sont remplaces par leurs valeurs (le contenu des fichiers) lors du traitement du document.
49
50
les entits externes doivent elles-mmes tre des fichiers XML bien forms. les entits externes n'ont pas contenir de prologue, celui-ci tant prsent dans le document principal. Il est cependant possible d'inclure une dclaration XML simplifie si celle-ci contient des caractres dans un codage diffrent de celui utilis dans le document principal. les entits externes ne doivent pas contenir une redfinition d'un lment du document principal. les dclarations d'entits internes au document principal sont valides dans les sous documents qu'il utilise.
51
Avertissement : les applications XML ne sont pas toutes capables de traiter les identificateurs publics. Aussi nous ne ferons qu'un bref passage sur ce point. Syntaxe : <!ENTITY nom PUBLIC fpi url> Un identificateur public permet une indirection entre le nom symbolique donn l'entit et son URL. Si l'application n'est pas capable de rsoudre l'identificateur public pour trouver la ressource de l'entit, le paramtre url de la dclaration d'lment est utilis. Exemple : <!ENTITY Rec-XML PUBLIC "-//W3//DOCUMENT Recommandation open The recommandation for XML 1.0//EN" "http://www.w3.org/TR/1998/RECxml- 9980210.xml"> Cette indirection est physiquement ralise par un fichier catalogue (une sorte de DNS). Si l'URL venait changer il suffirait de ne changer qu'une ligne dans le fichier catalogue. Avantage :
pas d'URL absolu donc pas de difficult de mise jour. recherche sur serveur le plus proche possible ou le plus facile d'accs
La dclaration d'entits non XML ncessite de dclarer pralablement le format de l'entit et d'associer ce format une application capable de le traiter. En XML une telle dclaration se nomme une NOTATION. Syntaxe : <!NOTATION nom_format SYSTEM url> On utilise le mot-clef NDATA dans l'entit afin de prciser le format du fichier. Ensuite la rfrence une telle entit se fait pas l'intermdiaire d'un attribut en utilisant le nom symbolique de l'entit.
53
Le XML est un langage strict. le document doit imprativement respecter la syntaxe du XML. On dira alors que le document est "bien form" [Well-formed]. Seuls les documents "bien forms" seront affichs correctement. A la moindre erreur de syntaxe, le document ne sera pas ou ne sera que partiellement affich.
Qu'appelle-t-on un analyseur ?
55
La rcupration des donnes encapsules dans le document ncessite un outil appel analyseur syntaxique (en anglais parser), permettant de parcourir le document et d'en extraire les informations qu'il contient On distingue deux types de parseurs XML :
les parseurs validants (validating) permettant de vrifier qu'un document XML est conforme sa DTD les parseurs non validants (non-validating) se contentant de vrifier que le document XML est bien form (c'est--dire respectant la syntaxe XML de base)
Analyseurs XML
56
Les analyseurs XML sont galement diviss selon l'approche qu'ils utilisent pour traiter le document. On distingue actuellement deux types d'approches :
Les API utilisant une approche hirarchique : les analyseurs utilisant cette technique construisent une structure hirarchique contenant des objets reprsentant les lments du document, et dont les mthodes permettent d'accder aux proprits. La principale API utilisant cette approche est DOM (Document Object Model) Les API bass sur un mode vnementiel permettent de ragir des vnements (comme le dbut d'un lment, la fin d'un lment) et de renvoyer le rsultat l'application utilisant cette API. SAX (Simple API for XML est la principale interface utilisant l'aspect vnementiel
57
Introductionn
58
XML permet d'utiliser un fichier afin de vrifier qu'un document XML est conforme une syntaxe donne. La norme XML dfinit ainsi une dfinition de document type appele DTD (Document Type Definition), c'est-dire une grammaire permettant de vrifier la conformit du document XML. La norme XML n'impose pas l'utilisation d'une DTD pour un document XML, mais elle impose par contre le respect exact des rgles de base de la norme XML. Ainsi on parlera de
document valide pour un document XML comportant une DTD document bien form pour un document XML ne comportant pas de DTD mais rpondant aux rgles de base du XML
intrts
59
sont rutilisables, ce qui vous vite de rcrire une DTD lorsque vous voulez composer plusieurs documents valides se conformant une mme structure. elles sont rutilisables ! De fait vous pouvez trouver des DTD libres de droit sur Internet et composer des documents se conformant une structure valide par toute une communaut dutilisateur. elles sont composables partir dautres DTD (moyennent quelques petites rgles respecter).
Un document valide peut inclure directement sa DTD dans sa dclaration de type. L'attribut standalone doit prendre la valeur yes, indiquant ainsi que le document est complet et qu'aucune dclaration externe ne doit tre recherche.
Exemple : <?xml version="1.0" standalone="yes" ?> <!DOCTYPE carte [ <!ELEMENT carte (#PCDATA)> ]> <carte>As de pique</carte>
sous forme externe,soit en appelant un fichier contenant la grammaire partir d'un fichier local ou bien en y accdant par son URL Le document peut aussi faire rfrence une DTD stocke dans une entit externe. L'avantage est alors la rutilisation possible de la DTD. Exemple :
Fichier jeu.xml <?xml version="1.0" standalone="no" ?> <!DOCTYPE carte SYSTEM "carte.dtd"> <carte>As de pique</carte>
Fichier carte.dtd
<?xml version="1.0" encoding="ISO8859-1" ?> <!ELEMENT carte (#PCDATA)> L'attribut standalone doit prendre la valeur no afin d'indiquer au processeur que des dclarations ou des parties de dclaration sont contenues dans des entits externes. La dclaration XML dans le fichier carte.dtd n'est pas indispensable mais elle permet d'indiquer la version d'XML utilise.
Il est possible de dfinir certaines dclarations en interne et de faire en mme temps appel une DTD externe. Les dclarations locales forment la partie interne et les dclarations contenues dans la DTD forment la partie externe. Exemple :
Fichier jeu.xml <?xml version="1.0" standalone="no" ?> <!DOCTYPE carte SYSTEM "carte.dtd" [ <!ATTLIST carte force (forte | moyenne | faible)> ]> <carte force="forte">As de pique</carte> Fichier carte.dtd <?xml version="1.0" encoding="ISO8859-1" ?> <!ELEMENT carte (#PCDATA)>
Les deux premiers types d'information s'effectuent l'aide des dclarations d'lments, alors que les deux autres s'effectuent l'aide des dclarations
dclarations d'entits gnrales des dclarations d'entits paramtres des dclarations de notations des dclarations d'lments des dclarations de listes d'attributs des commentaires
Pour pouvoir crer un document XML il est utile dans un premier temps de dfinir les lments pouvant tre utiliss, ou plus exactement les informations que l'on dsire utiliser. Ainsi pour dfinir un lment on utilisera la syntaxe suivante:
Type prdfini
Description L'lment peut contenir tout type de donnes L'lment ne contient pas de donnes spcifiques L'lment doit contenir une chane de caractre
<! ELEMENT Nom Modle > Le paramtre modle reprsente soit un type de donne prdfini, soit une rgle d'utilisation de l'lment. Les types prdfinis utilisables sont les suivants:
Ainsi un lment nomm Nom contenant un type #PCDATA sera dclar de la faon suivante dans la DTD:
<!
Le mot cl #PCDATA doit ncessairement tre crit entre parenthse, au risque sinon d'obtenir une erreur du parseur ! Cet lment pourra tre crit de la faon suivante dans le document XML:
<Nom>Pillou</Nom
D'autre part il est possible de dfinir des rgles d'utilisation, c'est--dire les lments XML qu'un lment peut ou doit contenir. Cette syntaxe se fait l'aide de notations spcifiques dont voici un rcapitulatif:
Oprateur + * ? | , () Signification L'lment doit tre prsent au minimum une fois L'lment peut tre prsent plusieurs fois (ou aucune) L'lment peut tre optionnellement prsent L'lment A ou B peuvent tre prsents (pas les deux) L'lment A doit tre prsent et suivi de l'lment B A+ A* A? A|B A,B Exemple
Les parenthses permettent de regrouper des lments afin (A,B)+ de leur appliquer les autres oprateurs
EXEMPLE
68
Il est possible d'ajouter des proprits un lment particulier en lui affectant un attribut, c'est--dire une paire cl/valeur. Ainsi avec XML la syntaxe pour dfinir un attribut est la suivante:
<! ATTLIST Elment Attribut Type > Type reprsente le type de donne de l'attribut, il en existe trois: littral: il permet d'affecter une chane de caractres un attribut. Pour dclarer un tel type il faut utiliser le mot cl CDATA l'numration: cela permet de dfinir une liste de valeurs possibles pour un attribut donn, afin de limiter le choix de l'utilisateur. La syntaxe de ce type d'attribut est: <! ATTLIST Elment Attribut (Valeur1 | Valeur2 | ... ) > Pour dfinir une valeur par dfaut il suffit de faire suivre l'numration par la valeur dsire entre guillemets : <! ATTLIST Elment Attribut (Valeur1 | Valeur2 ) "valeur par dfaut" > atomique: il permet de dfinir un identifiant unique pour chaque lment grce au mot cl ID.
Enfin chacun de ces types d'attributs peut-tre suivi d'un mot cl particulier permettant de spcifier le niveau de ncessit de l'attribut:
#IMPLIED signifie que l'attribut est optionnel, c'est--dire non obligatoire #REQUIRED signifie que l'attribut est obligatoire #FIXED signifie que l'attribut sera affect d'une valeur par dfaut s'il n'est pas dfini. Il doit tre immdiatement suivi de la valeur entre guillemets
XML permet de dfinir une application par dfaut lancer pour ouvrir des documents non XML encapsuls dans le code XML. Il est ainsi possible d'associer les images JPG au programme Paint Shop Pro (psp.exe) grce la syntaxe suivante : <! NOTATION jpg SYSTEM "psp.exe">
XML permet de crer des entits, c'est--dire de dclarer un groupe d'lments sous un nom afin de ne pas avoir rcrire ces derniers plusieurs fois dans la DTD s'ils se rptent, dans le mme esprit que les macros dans les diteurs de texte. D'autre part, l'utilisation d'entits dans un document XML permet :
une meilleure lisibilit un contrle accru sur le contenu une plus grande facilit de mise jour les entits gnrales les entits paramtres les entits caractres
73
XPath
Introduction
74
Historique: XPath est le rsultat dun effort dhomognisation de la syntaxe et de la smantique de fonctions communes XSLT, XPointer, etc. Le langage XPATH ore un moyen d'identifier un ensemble de nuds dans un document XML. Toutes les applications ayant besoin de reprer un fragment de document XML peuvent utiliser ce langage. XPath nest pas un langage XML (utilise une autre syntaxe) Sa syntaxe lmentaire ressemble l'expression
Arbre XML
75 <?xml version="1.0" encoding="ISO-8859-1" ?> <Livres> <Livre> <Titre> XML </Titre> <auteur> <nom> pop </nom> <prnom> koko </prnom> <Prix> 150dh </prix> <Edition> Lolo </Edition> </Livre> <Livre> ----</Livres>
Livres
Livre Titre Nom pop Prix Edition auteur Prnom Prix Titre
XML
koko
150 dh
lolo
Le langage XPath dsigne un ou plusieurs nuds en exprimant des chemins dans un arbre (chemins de localisation) Une expression XPath peut s'exprimer : relativement, vis vis d'un nud contextuel, ie: prendre pour origine un nud du document, dit nud contextuel.
Exemple
auteur/nom/text()
Le rsultat d'une expression XPath peut tre : un ensemble de nuds (ou un nud seul) une chane de caractres un nombre un boolen
Syntaxe XPath
77
Un chemin est constitu dune suite dtapes (ou pas), spares par des / . La forme gnrale est donc : [/]pas1/pas2/.../pasn
laxe qui dfinit le sens de parcours des nuds partir du nud contexte un test de nud ou le filtre qui indique le type des nuds qui seront retenus dans lvaluation du chemin ; le (ou les) prdicat(s) qui exprime(nt) des proprits que doivent satisfaire les nuds retenus lissue du filtrage pour tre finalement inclus dans le rsultat.
2.
3.
Axes
78
Un axe slectionne, dans larbre du document et partir du nud contexte, lensemble des nuds qui peuvent tre atteints en suivant une certaine direction. Un axe XPath recouvre alors les deux notions suivantes :
1.
2.
un sous-ensemble des nuds de larbre relatif au nud contexte ; lordre de parcours de ces nuds partir du nud contexte (avant ou arrire)
Axes
79
On distingue 13 axes :
Axe child attribute parent descendant Description Les fils du nud contexte Les attributs du nud contexte Le pre du noeud contexte Tous les descendants du noeud contexte
ancestor
Axes
80
Axe
self
Description
Le noeud contexte lui-mme
Tous les frres gauches du nud contexte Tous les frres droits du noeud contexte Les noeuds prcdant le noeud contexte dans lordre de parcours du
Axes
81
Axe
descendant-or-self contexte ancestor-or-self nud le nud contexte namespace
Description
Les descendants du nud contexte, et le nud lui-mme Les anctres du contexte, et lui-mme Sapplique aux espace de noms
82
Abrviation
. .. //
Description
quivalent self::node() quivalent parent::node() quivalent /descendant-orself::node()/
.// or@att
Un filtre permet dliminer un certain nombre de nuds parmi ceux slectionns par un axe. Il existe essentiellement deux faons de filtrer les nuds
n o n est un nom : slectionne les nuds de laxe de mme sorte que la sorte principale de laxe et dont le nom tendu est gal au nom tendu de n ; *: slectionne les nuds de laxe de mme sorte que la sorte principale de laxe ; node(): slectionne tout nud de laxe ; text(): slectionne tout nud de laxe de type texte ; comment(): slectionne tout nud de laxe de type commentaire ; Processing-instruction(n): slectionne tout nud de laxe
Prdicats
84
Un prdicat est une expression boolenne constitue dun ou plusieurs tests, composs avec les connecteurs logiques habituels and et or Exemple dune expression XPath avec prdicat. /Livres/Livre/descendant::text()[position()=1]
Types XPath
85
XPath connat quatre types de donnes : les numriques (-12.3) les chanes de caractres dlimites par des guillemets (") ou des apostrophes () les boolens : true et false ; un sous-ensemble, sans doublon, des nuds du document source.
1. 2.
3. 4.
Les fonctions fn:last(), fn:position(), fn:count(), fn:number(), fn:sum(), fn:round() fn:floor() fn:ceiling(), fn:abs() retournent des nombres fn:last() retourne lordinal du dernier frre ;
fn:number(objet) convertit objet en nombre ; fn:sum(noeuds) retourne la somme des valeurs des noeuds de nuds converties en nombres ; fn:round(nombre), fn:floor(nombre), fn:ceiling(nombre) arrondissent les nombres ; fn:abs(nombre) retourne la valeur absolue.
Les fonctions
fn:name(), fn:local-name(), fn:namespace-uri(), fn:string(), fn:concat(), fn:substring(), fn:substring-before(), fn:substring-after() retournent des chanes de caractres.
fn:string(objet) convertit objet en chane de caractres ; fn:concat(chane+) concatne les chanes de caractres fn:substring-before(chane, chane), fn:substring-after(chaine, chane ), retournent des sous-chanes de caractres ; fn:substring(chane,nombre,nombre?), retourne une sous-chane de caractres.
Les fonctions fn:starts-with(), fn:contains(), fn:boolean(), fn:not(), fn:true(), fn:false(), fn:lang() retournent des booleennes.
fn:starts-with(chane,chane) verifie si la premie`re chane commence par la seconde ; fn:contains(chane,chane) verifie si la premie`re chane contient la seconde ;
fn:boolean(objet) convertit objet en boolen : un nombre est vrai sil est non-nul, un ensemble de noeuds ou une chane de caractres sont vrais sil sont non-vides;
La fonction fn:id("toto") retourne le nud qui a comme identifiant unique toto. La fonction fn:id(noeuds) retourne les noeuds qui ont des identifiants uniques parmi les valeurs textuelles de tous les noeuds de noeuds. La fonction fn:id(objet) convertit dabord objet en chane de caractres, ensuite la subdivise en unites lexicales separees par des blancs, et finalement retourne tous les noeuds qui ont des identifiants uniques parmi celles-ci.
93
XSL
Via la programmation
deux librairies standards : DOM et SAX pour tous les langages de dveloppement Ncessite de dvelopper
Principe de XSL
le langage pour transformer un XML XPath pour retrouver une information dans un XML XSL-FO est un langage pour formater un 95 document XML
Une syntaxe pour dfinir une fraction dun document XML Utilise des expressions pour naviguer dans des documents XML Contient une librairie standard de fonctions Un standard W3C.
96
La terminologie XPath
Parent Enfant Siblings : nuds qui ont le mme parent Ancestors : le parent dun nud, le parent du parent, Descendants : le fils dun nud, le fils du fils du noeud,
97
Le principe :
Dfinit
un ensemble de nuds (parts) du document source quil fusionne avec une template Parcourt le document source. Ds quil trouve le nud, il appelle la template et produit le document rsultat
Utilisation de fonctions ddis laffichage des valeurs atomiques dun document source
98
XSLT : acteurs
99
XSL comment
quoi
XML source
partir de quoi
X Processeur XSLT
Processeur XSLT
XML rsultat
srialisateur
Arbre XML
101
Livres
Livre Titre Nom pop Prix Edition auteur Prnom Prix Titre
XML
koko
150 dh
lolo
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html><body> <p>Titre du corpus : <xsl:value-of select = "/Livres/Livre/auteur/nom"/> </p> </body> </html> </xsl:template> </xsl:stylesheet>
L'instruction xsl:value-of
103
<xsl:value-of select="/Livres/.../prenom"/>
La valeur de l'attribut select est une expression XPath : elle dsigne un endroit du document o aller chercher le texte.
"/Livres/livre/auteur/nom "
Document / 104
PI <?xml version=1.0?>
Element Lvres
Element Livre
Element
Element auteur
Element
Element
Text
Text
Text
<xsl:value-of select="/corpus/text/p/name"/>
Document / 105
PI <?xml version=1.0?>
Element corpus
Bien quil y ait plusieurs p, un seul chemin satisfait entirement lexpression (un seul p a un lment name)
Element p Element p
Element text
Element p
Element p
Text
Text
Text
XPath
106
XPath est une autre recommandation, comprise dans XSLT XPath remplit la fonction de "slectionner", "pointer" sur des lments du document, tandis que XSLT organise, trie, etc. XPath retourne des nuds de l'arborescence, par exemple des balises, des attributs, des nuds textes. XPath permet de dsigner les proprits XML (nom des balises et attribut, contexte, ordre)
Instruction XSLT
Il y a sans doute beaucoup de qui correspondent ce chemin. XPath les retourne tous, mais la fonction xsl:value-of ne slectionne que le premier pour l'afficher.
xsl:for-each
109
Si on veut traiter tous les nuds retourns par l'expression XPath, il faut utiliser xsl:foreach
<xsl:for-each select="expression XPath"> On traite une une les valeurs trouves </xsl:for-each>
110
</xsl:for-each>
<doc> <p>Premier <hi rend="italics">paragraphe</hi> lments</p> <p>Second paragraphe</p> <p>Troisime paragraphe</p> </doc> <para><i>Premier lments</i></para> <para><i>Second paragraphe</i></para> <para><i>Troisime paragraphe</i></para>
</xsl:for-each>
Element TEI.2
Element text
Element p
Element p
Element p
Element p
Text
Text
Text
112
xsl:for-each regroupe dabord les nuds avec select, ensuite excute le contenu de la boucle autant de fois quil y a de nuds
-
L'expression XPath de select trouve quatre nuds. S'il n'y avait qu'un seul lment, ou zro, la boucle serait excute une ou zro fois. chaque passage on traite un des nuds trouvs, qui devient le "nud contexte" durant ce passage et peut tre dsign par .. Dans le contenu de la boucle, on peut se dplacer nouveau dans l'arborescence, mettre un lment littral, etc.
<?xml version="1.0"?> <xsl:stylesheet version="1.0" 113 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html><body> <p>Titre du corpus : <xsl:value-of select = "/teiCorpus.2/teiHeader/fileDesc/titleStmt/title"/> </p> <xsl:for-each select="/teiCorpus.2/TEI.2"> <p>Titre : <xsl:value-of select="teiHeader/fileDesc/titleStmt"/> </p> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet>
<xsl:for-each select="/teiCorpus.2/TEI.2">
114 Element
Element TEI.2
Element TEI.2
Element TEI.2
Element TEI.2
Element
Element
Element
<xsl:value-of select="teiHeader/fileDesc/titleStmt/title"/>
Le contexte
115
C'est partir du nud contexte que sont values les expressions XPath qui ne commencent pas par "/" : select="teiHeader/fileDesc/titleStmt"
On dsigne, par rapport au nud contexte, un endroit de la sous-arborescence. On aurait pu crire aussi : select="./teiHeader/fileDesc/titleStmt"
On ne sait pas combien de textes ni de titres de niveau 1, 2, etc., il peut y avoir Il faut traiter tous les textes, et dans chaque texte traiter les niveaux 1, dans chaque niveau 1 traiter les niveaux 2, etc. On peut donc imbriquer des boucles xsl:for-each
A l'intrieur du for-each, chaque itration, le nud contexte est donc l'lment TEI.2 trait On peut lancer une nouvelle boucle, dans la premire, pour chercher les titres de niveaux 1 dans cet lment TEI.2 Lexpression XPath ne
<xsl:for-each select="/teiCorpus.2/TEI.2"> commence pas par / : text est recherch <p>Titre : parmi les enfants du <xsl:value-of select= "teiHeader/fileDesc/titleStmt/title"/> nud contexte (le TEI.2 trait) </p> <xsl:for-each select="text/body/div[@type = '1']"> <h1><xsl:value-of select="head"/></h1> </xsl:for-each> <hr /> Par rapport au nouveau contexte (div), </xsl:for-each> on dsigne le premier enfant head
119
select="text/body/div[@type = '1']"
1.
2. 3.
Ce qui est entre crochets est un prdicat : permet de filtrer les lments slectionns. @ permet de dsigner un attribut. Respecter lalternance guillemets / apostrophes
<xsl:value-of select="head"/>
Slectionne le premier lment head directement en dessous de div. On aurait pu crire aussi :
<xsl:value-of select="./head"/>
<xsl:for-each select="/teiCorpus.2/TEI.2"> <p>Titre : <xsl:value-of select="teiHeader/fileDesc/titleStmt/title"/></p> <xsl:for-each select="text/body/div[@type = '1']"> <h1><xsl:value-of select="./head"/></h1> <xsl:for-each select="div[@type = '2']"> <h2><xsl:value-of select="./head"/></h2> <xsl:for-each select="div[@type = '3']"> <h3><xsl:value-of select="./head"/></h3> </xsl:for-each> </xsl:for-each> </xsl:for-each>
<xsl:for-each select="/teiCorpus.2/TEI.2"> <xsl:sort select=teiHeader/fileDesc/titleStmt/title" order="ascending"/> <!-- les textes sont classs par leur titre--> <xsl:value-of select="." /> </xsl:for-each>
Les lments sont extraits avec for-each ; avant dtre traits un un, ils sont classs par xsl:sort, ici par ordre alphanumrique ( ascending ), en fonction du contenu du select de sort (ici les textes sont donc classs par leur titre).
Ajouter un index
122
xsl:number permet de retourner un nombre correspondant l'index de l'lment dans le node set.
<xsl:for-each select="/teiCorpus.2/TEI.2"> <xsl:number value="position()" format="1. "/> <xsl:value-of select="." /> </xsl:for-each> 1. Premier titre 2. Second Titre 3. Etc
xsl:output
123
Indiquer le jeu de caractres de la sortie avec <output encoding='...'> Indiquer le type de sortie (text, XML, HTML) avec mode (Permet dajouter le prologue XML ou HTML)
xsl:if
125
Exemples de xsl:if
126
Une expression XPath peut tre utilise avec xsl:if pour voir si elle retourne vrai ou faux :
Elle
retourne vrai si elle trouve des nuds. Elle retourne faux si elle ne trouve rien.
xsl:choose
128
Exprimer des alternatives avec xsl:choose. Le premier lment when dont le test est positif est excut.
<xsl:choose> <xsl:when test='expression XPath'> [action] </xsl:when> <xsl:when test='expression XPath'> [action] </xsl:when> <xsl:otherwise> [action] </xsl:otherwise> </xsl:choose>
...
<xsl:template 129
match="/">
<xsl:if select="teiHeader/fileDesc/sourceDesc"> <p> Source du texte : <xsl:if select=".//author"> <xsl:value-of select="." /> </xsl:if> <xsl:if select=".//docDate"> <xsl:text> (</xsl:text> <xsl:value-of select="." /> <xsl:text>), </xsl:text> <xsl:if> <xsl:if select=".//title"> <i><xsl:value-of select="title" /></i> <xsl:if> </p> </xsl:if>
...
Dans un nud texte, on peut extraire une sous chane. ex. Extraire la date seule dans "value = "2002"" Utiliser la fonction XPath "substring-after()" qui prend deux arguments
La chane source La chane partir de laquelle slectionner le texte.
substring-after(chane, pattern)
Exemple
131
<xsl:if test="docDate"> <xsl:text> (</xsl:text> <xsl:value-of select= "substring-after(docDate, '= ')" /> <xsl:text>), </xsl:text> <xsl:if>
substring-after(docDate, = )
"2002"
132
XPath dans ce cas retourne une chane, et non plus un sac de nuds . En attendant XSLT 2.0 et les expressions rgulires, les fonctions chanes de XPath sont nombreuses mais rudimentaires:
substring-before(chane, pattern) substring-after(chane, pattern) substring(chane, index, len?) ex: substring(1234567890, 2, 5) => 23456 string-length(chane) ex: string-length(1234567890) => 10 concat(chane cible, chane ajouter) Deux fonctions sur les chanes retournent une valeur boolenne : starts-with() ex: <xsl:if test="starts-with(docDate, 'va')"> [action] </xsl:if> contains(chane tester, chane test) ex: <xsl:for-each select=docDate[contains(., 2002')]"> <!-- Slectionne les noeuds contenant 2002 -->
134
Exemple d'utilisation : on veut les lments en italique, avec la valeur IT dans l'attribut @rend. Mais @rend peut galement contenir "IT BO" ou "BO IT" pour marquer italique + gras, etc. On ne les extraira pas si on utilise select="//*[@rend = 'IT']", qui recherchera les @rend avec comme valeur exactement IT. contains permet ici de rcuprer tous les italiques Select="//*[contains(@rend, 'IT')]"
135
Ces fonctions ne sont utiles que sur des contenus trs normaliss : XSLT nest pas adapt au traitement de chanes de caractres.
Impossible
par exemple de sen servir pour extraire les phrases en se basant sur la ponctuation
QUANTIFIER
Cette fonction XPath permet de retourner le nombre de nuds trouvs dans lexpression XPath entre parenthses Permet de dnombrer tout phnomne exprim en XML
<xsl:value-of select= "count(//p[@type = 'intro'])"/> <xsl:value-of select= "count(//*[@lang = 'en'])"/> <xsl:value-of select= "count(//div/p[1]/*[@ana= 'exemple'])"/>
Jusqu prsent on a systmatiquement mis le rsultat dune expression XPath dans xsl:value-of, qui affiche directement le rsultat. Mais si lon veut stocker et manipuler la valeur, pour afficher par exemple un pourcentage plutt que le chiffre brut ?
xsl:variable
139
xsl:variable permet de strocker puis de rutiliser une chane ou un fragment darbre. On cre une variable avec xsl:variable
<xsl:variable name='hello' select="hello world"/> @name pour lui donner un nom @select : calculer sa valeur (expression XPath ou texte littral)
On dsigne la valeur de la variable avec le nom prfix de $ dans une expression XPath
<xsl:value-of select="$hello"/>
Nom de la variable : Valeur de la variable :
<xsl:variable name="nbrDiv" select="count(//div)" /> <xsl:variable name="nbrDiv1" select="count(//div[@type = '1'])" /> <xsl:variable name="nbrDiv2" select="count(//div[@type = '2'])" /> Pourcentage de section de niveau 1 : <xsl:value-of select="($nbrDiv1 * 100) div $nbrDiv" /> Pourcentage de section de niveau 2 : <xsl:value-of select="($nbrDiv1 * 100) div $nbrDiv" />
Une variable reste utilisable dans tout llment dans lequel elle a t dclare dans la feuille de style et dans les sous-lments de celui-ci. Une fois sortie de cet lment, elle est dtruite
Une variable dclare directement comme enfant de xsl:stylesheet peut tre utilise dans toute la feuille de style. Une variable dclare dans un lment (xsl:template, xsl:if, etc.) ne peut tre utilise que dans cet lment et ses sous-lments.
sum(node set) calcule la somme de toutes les valeurs prsentes dans le node set round(numbre) arrondit number lentier le plus proche Exemple round(2.3) retourne 2
Etc.
143
Problme : on rpte n fois la mme opration pour calculer des pourcentages Solution : factoriser cette opration XSLT permet de crer une sous-routine (un template) qui retourne une valeur en fonction d'arguments
<xsl:template match="/"> <xsl:variable name="nbrDiv" select="count(//div)" /> <xsl:variable name="nbrDiv1" select="count(//div[@type = '1'])" /> <xsl:variable name="nbrDiv2" select="count(//div[@type = '2'])" /> Pourcentage de section de niveau 1 : <! La formule du calcul du pourcentage est confie un template, auquel on transmet des arguments --> <xsl:call-template name="calculPourcentage"> Appel dun template <xsl:with-param name="Nbr1" select="$nbrDiv1"/> <xsl:with-param name="Nbr2" select="$nbrDiv"/> xsl:with-param permet </xsl:call-template> de transmettre les Pourcentage de section de niveau 2 : <!-- etc. --> <!-- calcul des pourcentages --> <xsl:template name="calculPourcentage"> <xsl:param name="Nbr1"/> <xsl:param name="Nbr2"/> <xsl:value-of select="($Nbr1 * 100) div $Nbr2"/> </xsl:template>
144
arguments
146
Nous avons vu une faon d'utiliser XSLT o l'on sait o chercher l'information extraire. Cette dmarche est adapte pour les cas o l'on fait une extraction de faible volume dans des endroits prcis de la structure. Mais
Si l'on veut, plutt qu'extraire un lment, recopier la totalit du document sauf un lment ? Ou si l'on veut extraire un grand nombre d'lments ? XML a une structure non limite : il faudrait un nombre irraliste de for-each et if Il est plus conomique dans ce cas d'indiquer ce que l'on veut enlever ou modifier que ce que l'on veut extraire.
Besoins .
148
Plutt que de dcrire des oprations, on dessine un nouvel arbre en indiquant seulement les points modifier de l'arbre existant.
Retour en arrire
149
Toutes les feuilles de style commenaient par <xsl:template match="/"> Cet lment xsl:template sert regrouper des actions faire un "moment" prcis Ce moment est dsign dans l'attribut @match @match attend une expression XPath, ici "/" indique la racine du document. Un template avec match="/" est excut en premier, puisque la racine est la premire chose que cherche le processeur.
Il suffit, pour llment que lon veut traiter, de lui faire un lment template avec un @match qui lui correspond.
@match peut correspondre tout nud : lment, attribut (avec @) ou texte (avec text()). Exemple : un template qui sappliquera chaque lment titre dans le document :
<xsl:template match= titre"> ... <xsl:template>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > <xsl:template match= auteur"> <h1>le titre est: <xsl:value-of select=".//titre" /> </h1> <xsl:apply-templates /> </xsl:template>
</xsl:stylesheet>
xsl:apply-templates
152
Dans l'exemple prcdent, applytemplates sert relancer l'analyse (la recherche d'un template avec un attribut match qui correspond) dans la sousarborescence du nud trait par le template Si on ne met pas apply-templates le processeur est teint , il abandonne tout ce qui est en dessous
Aprs avoir construit une reprsentation du document, le processeur rentre dans l'arborescence. Il cherche dans la feuille de style un template qui correspond sa premire position, qui est "/" S'il n'en trouve pas, il passe aux descendants et recommence. Sil trouve un nud texte, il imprime son contenu.
Document / 154
Le processeur parcours les lments dans un ordre prvisible (les attributs d'un lment dans un ordre non prvisible)
PI <?xml version=1.0?>
Element livres
Element livre
Element titre
Element auteur
Element prix
Element edition
Text
Text
Text
155
Tant que parmi les descendants le processeur ne trouve pas de templates appliquer, il continue descendre dans lordre enfant / frre, en imprimant les nuds texte.
Si un template avec match=auteur" est dfini, le processeur lapplique, sinon il descend au nud texte, limprime, et remonte au p suivant Idem : sil nexiste pas de template pour name, passe aux nuds enfants
Element titre
Element auteur
156
Si un template correspond, le processeur lexcute, et ne passe aux descendants que lorsquil est explicitement relanc avec linstruction xsl:apply-templates
Toutes les balises name et leur contenu sont remplacs par M. *** .
Lenchssement
157
Dans un template, l instructions, xsl:applytemplates a un effet spcial : elle relance la recherche de templates parmi les enfants.
Quand le processeur a fini de traiter les descendants, il reprend et termine lexcution du template d'o il est parti du fait de l'instruction apply-templates
Sinon, il ne rentre pas dans la sous-arborescence. Avec les xsl:apply-template les templates sont donc "enchsss" autant de fois que ncessaire pendant l'excution. xsl:template permet de traiter les lments inclus, contrairement value-of
L'enchssement (2)
158
<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <html><body> <xsl:apply-templates /> </body> </html> </xsl:template> <xsl:template match=titre"> <item><xsl:value-of select="." /> </item> </xsl:template> </xsl:stylesheet>
1. Imprim en premier 2. Passe la descendance, alors que le template n'est pas fini. Imprime le texte contenu dans les lments sauf titre 3. Tous les titre sont traits
4. Quand la descendance est traite "remonte" de templates appelant en templates appelant et fini chacun. Cette ligne est donc imprime en tout dernier
Utilisation de xsl:apply-templates
159
<xsl:template match="/"> <html><body> <h1>1. les ref</h1> <xsl:apply-templates select="//livre"> <h1>2. les id</h1> <xsl:apply-templates select="//livre/@cat"> </body></html> </xsl:template>
select indique o relancer l'analyse dans l'arborescence. Le processeur ne cherche pas de templates pour les 161 descendants de /, par exemple il saute par-dessus un teiHeader.
PI <?xml version=1.0?>
Document /
Element corpus
Element text
Element p
Element p
Element p
Element p
Text
Text
Text
162
<xsl:template match=p">
Pour chacun des fragments dsigns par select, la recherche de templates et le parcours dans la sousarborescence reprend
Element p
Element p
Element p
Element p
Text
Text
Text
163
@select permet ici de descendre directement plus bas dans la sous-arborescence en "sautant" toute une partie. On peut aussi dsigner un endroit qui n'est pas dans la sous arborescence, voire relancer l'analyse la racine avec un select="/" qui fait boucler indfiniment. Note : par dfaut, un xsl:apply-templates contient donc un @select="node()" qui le fait slectionner ses enfants
Une feuille de style contenant ce seul template recopie le document source en enlevant toutes les balises :
<xsl:template match="/"> <xsl:apply-templates /> </xsl:template>
Par dfaut, dans tous les nuds o il ne trouve pas de xsl:template qui sapplique, le processeur imprime le contenu pour les noeuds de type texte et passe aux enfants pour les autres types de nuds.
On veut recopier le texte du corpus sans balises, et sauter les header du corpus et des textes.
Dans ce cas de figure, la majorit du corpus est recopi, et c'est seulement un tag dont le contenu est exclure. La mthode la plus conomique consiste donc laisser le processeur recopier par dfaut, et indiquer le tag exclure.
Mthode 1
166
Mthode 2
167
Plutt que d'indiquer au processeur des chemins parcourir qui excluent les headers, on peut modifier son action par dfaut (recopier le texte) sur les nuds exclure :
Pourquoi, par dfaut, le processeurs descend dans l'arborescence et imprime les noeuds textes? Une feuille de style a deux templates par dfaut ; Ces templates sont appliqus quand le processeur ne trouve pas dans la feuille de style un template correspondant au noeud trait
Correspond la racine (/) ou (|) tout element (*). Action = avancer le processeur aux enfants (incluant lment, attribut et noeud texte : apply-template par dfaut @select=node()), et leur appliquer les templates. Correspond tout noeud texte. Action = imprimer son contenu
169
Le processeur applique le template le plus spcifique. On peut utiliser cette proprit pour prvoir un cas gnral et des cas particuliers :
@match="p" : sapplique tous les p sauf... @match="p[1]" sapplique tous les ans des fratries.
On peut redfinir les templates par dfaut pour modifier le comportement du processeur. Si on ajoute
<xsl:template match="text()"> </xsl:template>
le processeur parcours toujours l'arborescence mais n'imprime plus les noeuds textes.
171
On veut extraire du corpus seulement le contenu des nuds note. Dans ce cas de figure la majorit du corpus est exclure, seulement un tag est conserver. Comme dans l'exemple prcdent on peut utiliser deux possibilits :
Indiquer
le chemin qui mne aux nuds voulus Laisser le cheminement par dfaut dans l'arborescence, mais modifier le comportement par dfaut pour ne pas recopier les nuds textes
Mthode 1
172
Laisser le comportement par dfaut, mais utiliser @select pour mener directement sur les note
<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <xsl:apply-templates select="//note"> </xsl:template> </xsl:stylesheet>
Mthode 2
173
On modifie le comportement par dfaut : on laisse le cheminement dans l'arborescence, mais les nuds textes ne sont plus recopis, sauf pour le nud voulu.
<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="text()"> </xsl:template> <xsl:template match="note"> <note><xsl:value-of select='.'/></note> </xsl:template> </xsl:stylesheet>
Le processeur parcours larborescence, pilot par des templates, qui peuvent l'arrter des endroits prcis, excuter des instruction XSLT, et le relancer Quand il ne trouve pas de template appliquer, le processeur parcours l'arborescence, relanc par un template par dfaut, dans un ordre lments enfants / lments frres, et imprime le texte. A moins quun template capte le processeur dans larborescence et ne le relance pas, larbre est parcouru entirement, et tous les nuds textes sont rpliqus.
Lensemble de ces moyens daction permet d'utiliser l'approche la plus conomique pour dcrire une transformation de larborescence source en une arborescence cible.
Exemple
176
de lire le fichier l'cran avec un navigateur internet, de l'ouvrir avec Microsoft Word pour l'imprimer ou le convertir dans le format Word.
GROUPER
<xsl:for-each select="//@cat"> la liste produite peut contenir plusieurs fois la mme valeur.
exemple partir de plusieurs tag correction (<corr resp="DC" date="12-06-2002">), les classer par correcteur sans les connatre l'avance.
Solution : xsl:key
179
xsl:key dclare une variable dans laquelle des nuds sont regroups par "clefs". xsl:key a trois attributs obligatoires :
@name
: donne un nom la variable @match : une expression XPath indiquant les nuds collecter @use : une expression XPath indiquant quelle valeur utiliser pour grouper ces nuds.
180
On recherche les tags corr On les groupes selon la valeur de leur attribut @resp (le contexte de cette expression XPath est le nud corr)
en se <corr sic='dsaisissant' resp='DB'>dessaisissant</corr> ... <corr sic='desine' resp='DB'>dessine</corr> dj les traits ... <corr sic='l'originial' resp='CF'>l'original</corr> ... <corr sic='uotre' resp='CF'>notre</corr> Clefs
DB
Nuds collects
<corr sic='dsaisissant' resp='DB'>dessaisissant</ corr>
<corr sic='l'originial' resp='CF'>l'original</corr> <corr sic='desine' resp='DB'>dessine</corr>
CF
Key
181
Llment key dfinit un groupe de nud, lui attribue un nom et dfinit lexpression (la clef) qui permet de diffrencier les nuds au sein de ce groupe.
Utilisation
182
Une fois cre une variable xsl:key peut tre utilise pour obtenir les nuds associs une clef. la fonction XPath key(nom_table, clef) retourne tous les nuds associs l'entre clef dans la table nom_table
<xsl:for-each select="key(grouperParResp, 'DB')"> Texte d'origine : <xsl:value-of select="@sic"/> Texte corrig : <xsl:value-of select="."/> </xsl:for-each>
Appliqu l'exemple prcdent :
: : : :
Avec la fonction key() on ne peut que retrouver les nuds associs une clef, on ne peut pas lister directement les clefs d'une variable xsl:key. Pour une liste de valeurs diffrentes, par exemple la liste des valeurs utilises dans @lang, il faut utiliser une mthode dtourne :
utiliser une expression qui extrait un lment de chaque groupe correspondant une clef.
Par exemple ne prendre que les lments dont l'index dans le groupe dont il fait parti est 1 Pour savoir si un nud est le mme que le premier retourn par un groupe , on peut comparer la valeur que retourne generate-id() qui retourne un identifiant unique constant pour chaque nud.
Exemple
184
<xsl:key name="langues" match="//@lang" use="."/> <xsl:for-each select="//@lang[generate-id(.)= generate-id(key(Langues', .)[1])]"> ... key(Langues', .) retourne le groupe des noeuds doublons du noeud trait. key(Langues', .)[1] retourne le premier lment du groupe generate-id retourne un identifiant unique pour un noeud. L'id du noeud contexte doit tre le mme que l'id du premier noeud du groupe des noeuds doublons. On slectionne uniquement le premier noeud de chaque groupe, donc un noeud par groupe.
185
Cette mthode peut tre utilise avec un nud diffrent entre match et use :
<xsl:key name="Langue" match="*[@lang]" use="@lang"/> <table> <tr> <td>Langues</td> <td>Nombre d'lments dans cette langue</td> </tr> <xsl:for-each select="//*[@lang and generate-id(.)= generate-id(key('Langue', @lang)[1])]"> <tr> <td><xsl:value-of select="@lang" /></td> <td><xsl:value-of select="count(key('Langue', @lang))"/> </td> </tr> </xsl:for-each> </table>
186
@use peut tre n'importe quelle expression calcule. Par exemple on peut grouper les p en fonction du nombre de notes quils contiennent
xsl:key
On peut imaginer maintenant de regarder pour chaque groupe la position moyenne en dbut ou fin de texte, etc.
188
Jusquici XSLT tait utilis pour extraire des donnes, pas pour diter le corpus source. XSLT impose de nombreuses limites une utilisation pour ajouter de linformations : il est difficile de recopier lidentique. Ldition dun corpus avec XSLT ne peut donc se faire que sur des corpus trs normaliss.
A La diffrence de value-of, copy-of retourne la reprsentation textuelle de larborescence. xsl:copy-of ne permet pas dajouter de linformation, mais illustre les limites de la duplication identique, par exemple la perte du prolog (<!DOCTYPE...) que XSLT ne prend pas en charge
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
<xsl:template match="/"> <xsl:copy-of select="." /> </xsl:template> </xsl:stylesheet>
xsl:copy
190
En utilisant rcursivement la fonction copy dans un template, on peut obtenir cette duplication et dfinir des templates pour ajouter des modifications
<xsl:template match="node() | @*"> <xsl:copy> <xsl:apply-templates select="node() | @*"/> </xsl:copy> </xsl:template>
<!-- Les templates de modification : --> <xsl:template match="xptr[not(@id)]"> <!-- on supprime les xptr sans id. --> </xsl:template>
xsl:element et xsl:attribut
191
Pour gnrer des balises et des attributs on peut utiliser les lments xsl:element et xsl:attribut qui permettent de les construire pas pas. Les deux fonctions prennent un attribut name, qui sera le nom de la balise ou de lattribut, et le texte contenu dans xsl:element et xsl:attribut deviendra le texte de llment ou la valeur cr.
Dans un corpus les notes sont regroupes la fin du document. Des lments ptr ont permis denregistrer lendroit des appels de note ; leur attribut @target permet de les associer la note dont lattribut @id correspond Le but est de remonter les notes, conformment aux prescription TEI, directement leur point dinsertion dans le texte et supprimer les pointeurs ptr.
193
<xsl:template match="node() | @*"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> <xsl:template match="ptr"> <xsl:variable name="id" select="@target" /> <xsl:element name="note"> <xsl:for-each select="./ancestor::text/back/note[@id=$id]/@*"> <xsl:attribute name="{name(.)}"> <xsl:value-of select="."/> </xsl:attribute> </xsl:for-each> <xsl:value-of select=".//ancestor::text/back/note[@id=$id]"/> </xsl:element> </xsl:template> <xsl:template match="note"> </xsl:template> </xsl:template> Cf. ci-joint "ajout.xsl"
CONCLUSION
Limites d'XSLT
195
Lourd et insuffisant pour la manipulation des chanes de caractre (les nuds texte)
Prvu pour la manipulation de la structure, de l'encodage plus que du contenu des nuds textes Prvoir dix fois la taille du fichier en mmoire vive.
Ces limites sont dues l'approche "arborescente" : XSLT permet de manipuler une arborescence en mmoire.
Une autre reprsentation du contenu, dite "squentielle" permet plus de prcision et nest pas limit par la taille du document, mais demande lutilisation dun langage de programmation.
Deux stratgies cumuler : dominante procdurale ou dclarative. Economie et plasticit grce lutilisation de templates et templates par dfaut. Adapt lextraction dinformation, la projection de sous-corpus ou la conversion vers dautres formats. La version 2 de XSLT apportera des amliorations (expressions rgulires, typage, regroupement), sans changer cette dominante extraction , plus que dition , dans la transformation