Les liens en XML
On a vu comment utiliser des balises HTML dans un document XML. Il est donc possible d'avoir (en supposant que le document XML contienne xmlns:html="http://www.w3.org/Profiles/XHTML-transitional):
<html:a href="UneURL">...</html:a>
mais XML offre bien d'autres possibilités bien plus riches: des liens simples qui ressemblent aux liens HTML, tout en offrant une plus grande variété de comportements, et des liens complexes.
Note: la spécification XLink a été redéfinie récemment (21 février 2000). Ce qui suit n'est donc pas encore implanté dans les butineurs.
XLink
Liens simples
-
Tout élément XML peut utiliser les attributs
xlink:type, xlink:href, xlink:show,
xlink:actuate et xlink:title pour que le contenu de
l'élément porte un lien vers un autre point du cyber-espace:
attribut valeurs possibles signification xlink:type simple xlink:href une URL destination (unique) du lien xlink:show new le document destination apparaîtra dans une nouvelle fenêtre replace le document destination apparaîtra dans la même fenêtre que le document courant (comportement similaire aux liens HTML) embed le document destination apparaîtra dans le document courant, à la place de l'élément constituant le lien (comportement similaire aux balises HTML <img> et <object>) undefined l'application traîtant le document choisira le traitement approprié xlink:actuate onLoad le document destination apparaîtra dès le chargement du document courant (comportement similaire aux balises HTML <img> et <object>) onRequest le document destination apparaîtra quand l'utilisateur activera le lien (généralement en "cliquant" dessus) undefined l'application traîtant le document choisira le moment approprié xlink:title une chaîne de caractères le texte fourni pourra servir d'indice supplémentaire, par exemple en étant affiché quand la souris se trouve sur l'élément contenant le lien -
Exemple: reprenons notre article et ajoutons y un lien simple sur
l'élément auteur, qui pointe vers la homepage de l'auteur,
ainsi qu'un lien simple sur l'élément HTML img, qui
pointe vers un document donnant des détails sur la photo incluse dans
l'article
<article xmlns:xlink="http://www.w3.org/1999/xlink" >
<titre>Un journaliste accuse, un policier dément</titre>
<auteur xlink:href="AlainHome.xml" xlink:type="simple" xlink:show="replace" xlink:actuate="OnRequest" xlink:title="Homepage">Alain Connu</auteur>
...
<texte>
<image>
<html:img src="photo.gif" xlink:href="Details.xml" xlink:type="simple" xlink:show="replace" xlink:actuate="OnRequest" xlink:title="details" />
</image>
</texte>
</article> -
On peut aussi définir, dans le schéma définissant la
structure de nos document, un élément lien qui pourra
être utilisé sur du texte simple plutôt que sur un
élément existant du document XML (fichier "article.xsd"):
<xsd:element name="lien" >
<xsd:complexType mixed="true" >
<xsd:attribute name="xlink:type" fixed="xlink:simple" />
<xsd:attribute name="xlink:show" fixed="xlink:replace" />
<xsd:attribute name="xlink:actuate" fixed="xlink:OnRequest" />
<xsd:attribute name="xlink:title" type="xsd:string" use="optional" />
</xsd:complexType>
</xsd:element>Il suffira alors, dans le document XML, d'entourer le texte par <lien xlink:href="...">...</lien>. Exemple:
<article xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="article.xsd"
xmlns:xlink="http://www.w3.org/1999/xlink" ... >
...
<texte>
...
<image>
<html:img src="photo.gif" />
<legende>Legende de la <lien xlink:href="photo.gif" xlink:title="pour voir la photo seule">photo</lien></legende>
</image>
</texte>
</article>
document XML avec tous les attributs XLink (code XML correspondant) - code du schéma - code de la feuille de style CSS
document similaire mais qui utilise l'élément <lien> pour mettre un lien sur l'image
Liens étendus
-
associent un nombre arbitraire de ressources
-
la définition d'un lien étendu peut se faire dans un fichier
séparé des ressources qu'il associe.
-
dans un lien étendu, la désignation de l'emplacement des ressources
est séparé du mécanisme de "traversée"
-
un lien étendu est composé des éléments suivants:
- localisation des ressources à distances (éléments de type locator)
- mécanisme de traversée (éléments de type arc)
- étiquettage pour faciliter l'utilisation du lien par une personne (éléments de type title)
-
ressources locales associées par le lien (éléments de
type resource)
-
un lien étendu est défini sur n'importe quel élément
XML auquel on rajoute l'attribut xlink:type="extended" (en supposant que
"xlink" est le préfixe choisi pour l'espace de nom. D'autres attributs
sur l'élément en question ou sur des sous-éléments
imbriqués définiront l'ensemble du lien:
Attention: la sémantique et le type de valeurs associées à l'attribut xlink:role a changé depuis la spécification XLink de 1999. La sémantique anciennement associée à xlink:role a maintenant été attribuée à un attribut xlink:label et xlink:role est maintenant utilisé simplement pour documenter les ressources impliquées dans un lien étendu; sa valeur n'est plus un identificateur, mais l'URI d'un document décrivant un type de ressource.
attribut valeur signification xlink:type
(obligatoire)extended définition de l'élément englobant formant un lien étendu xlink:role URI adresse d'un document décrivant le rôle du lien étendu (le lien étendu, comme n'importe quel autre élément d'un document XML, peut être considéré comme une ressource composant un autre lien étendu) xlink:title une chaîne de caractères donne un commentaire sur le lien étendu dans son ensemble
attribut valeur signification xlink:type
(obligatoire)locator définition d'un élément englobé dans un lien étendu et servant à définir un point d'attache pour les arcs du lien (permettra de définir l'emplacement du point de départ ou d'arrivée d'un ou plusiers arcs xlink:href
(obligatoire)une URL emplacement d'une ressource externe; peut désigner un fragment d'un document XML (c.f. la spécification de Xpointer) xlink:role URI adresse d'un document décrivant le rôle de la ressource externe xlink:label identificateur l'identificateur utilisé ici peut être utilisé comme valeur de l'attribut xlink:from ou xlink:to d'un autre élément pour créer un arc entre l'élément courant et cet autre élément xlink:title une chaîne de caractères donne un commentaire sur la ressource externe désignée par l'élément courant
attribut valeur signification xlink:type
(obligatoire)arc établissement d'un arc entre deux des ressources associées au lien étendu, l'une constituant le point de départ de l'arc et l'autre le point d'arrivée. xlink:arcrole URI adresse d'un document décrivant le rôle de l'arc xlink:from identificateur (avec préfixe si l'identificateur est défini dans un autre fichier) l'identificateur utilisé ici doit être défini dans un autre élément à l'aide de l'attribut xlink:label. Il indique alors que cet autre élément est le point de départ de l'arc spécifié par l'élément courant xlink:to identificateur (avec préfixe si l'identificateur est défini dans un autre fichier) l'identificateur utilisé ici doit être défini dans un autre élément à l'aide de l'attribut xlink:label. Il indique alors que cet autre élément est le point d'arrivée (destination) de l'arc spécifié par l'élément courant xlink:show new, replace, embed, udefined comme pour les liens simples xlink:actuate onLoad, onRequest, undefined comme pour les liens simples xlink:title une chaîne de caractères le texte fourni pourra servir d'indice supplémentaire, par exemple en étant affiché quand la souris se trouve sur l'élément contenant le lien
attribut valeur signification xlink:type
(obligatoire)resource définition d'une ressource locale englobée dans le lien étendu xlink:role URI adresse d'un document décrivant le rôle de la ressource xlink:label identificateur l'identificateur utilisé ici peut être utilisé comme valeur de l'attribut xlink:from ou xlink:to d'un autre élément pour créer un arc entre l'élément courant et cet autre élément xlink:title une chaîne de caractères le texte fourni pourra servir d'indice supplémentaire, par exemple en étant affiché quand la souris se trouve sur l'élément contenant le lien
attribut valeur signification xlink:type
(obligatoire)title le contenu de cet élément va servir à la place de l'attribut xlink:title de l'élément englobant, permettant ainsi de ne pas être limité à du texte simple. Plusieurs élément de ce type peuvent être présents dans le même élément englobant, par exemple pour fournir des traductions dans différentes langues du même contenu. -
Exemple: la photo de l'article pris comme exemple précédemment
pourrait avoir un lien étendu qui permettra d'accéder à
plein d'informations différentes la concernant (photographe, date
de prise, agrandissement, copyright, etc.)
<image xlink:type="extended" xlink:title="informations disponibles" >
<html:img src="..." xlink:type="resource" xlink:label="depart" />
<res xlink:type="locator" xlink:href="..." xlink:label="photographe" />
<res xlink:type="locator" xlink:href="DetailsPhoto382.xml#DatePrise" xlink:label="date" />
<res xlink:type="locator" xlink:href="Photo382Big.jpg" xlink:label="agrandissement" />
<res xlink:type="locator" xlink:href="Copyright.xml" xlink:label="copyright" />
<vers xlink:type="arc" xlink:from="depart" xlink:to="photographe" xlink:title="prise par" xlink:show="new" xlink:actuate="onRequest" />
<vers xlink:type="arc" xlink:from="depart" xlink:to="date" xlink:title="date de la prise" xlink:show="embed" xlink:actuate="onLoad" />
<vers xlink:type="arc" xlink:from="depart" xlink:to="copyright" "xlink:title="©" xlink:show="replace" xlink:actuate="onRequest" />
<vers xlink:type="arc" xlink:from="depart" xlink:to="agrandissement" xlink:title="version 1280x1024 pixels" xlink:show="replace" xlink:actuate="onRequest" />
</image>document XML avec tous les attributs XLink (code XML correspondant) - code du schéma - code de la feuille de style CSS
-
Exemple: lien étendu représentant une cellule familliale. Supposons
que les membres de la famille sont représentés par des
éléments XML de la façon suivante (certains:
<famille xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="extended" xlink:title="ma famille" >
<personne xlink:title="p1" xlink:type="resource" xlink:label="parent">
<nom>...</nom>
<prenom>...</prenom>
<dateNaissance>...</dateNaissance>
...
</personne>
<personne xlink:title="p2" xlink:type="resource" xlink:label="parent"> ... </personne>
<personne xlink:title="p3" xlink:type="resource" xlink:label="enfant"> ... </personne>
<personne xlink:title="p4" xlink:type="resource" xlink:label="enfant"> ... </personne>
<res xlink:title="p5" xlink:type="locator" xlink:label="enfant" xlink:href="..."/>
<vers xlink:type="arc" xlink:from="parent" xlink:to="enfant"/>
</famille>L'élément de type "arc" ci-dessus permet, en une seule déclaration, de relier tout élément étiquetté "parent" à tout élément étiquetté "enfant".
Si, dans un élément de type "arc", on omet l'attribut xlink:from ou l'attribut xlink:to, l'information manquante est interprétée comme correspondant à tous les éléments de type "xlink:locator" définis dans l'élément de lien étendu.
XPointer+XPath
- Pour désigner un fragment de document plutôt qu'un document complet, HTML avait un mécanisme basé les points d'ancrage (<a name="...">...</a>) qui a ensuite été généralisé dans HTML 4 aux identificateurs (<UneBaliseHTML id="...">).
- En XML il est aussi possible de désigner un fragment de document comme destination d'un lien. Le mécanisme d'identificateurs de HTML 4 fonctionne aussi avec XML. Il suffit de placer l'attribut ID="UnNom" sur un élément et d'utiliser la notation UneURL#UnNom
- Mais il est aussi possible de désigner un fragment sur la base de la structure hiérarchique du document.
XPath
- XPath définit une notation commune utilisée par XPointer et par XSLT pour faire référence à une partie d'un document XML
- XPath fonctionne sur un modèle du document XML basé sur une structure arborescente dans laquelle les éléments, les attributs et les morceaux de texte entre sous-éléments d'un contenu mixte constituent des noeuds séparés.
-
Une expression XPath produit un résultat qui peut être:
- un ensemble non-ordonné de noeuds
- une valeur booléenne (vrai ou faux)
- un nombre en virgule flottante
- une chaîne de caractères
- La forme d'expression la plus courante sert à désigner pas par pas le chemin aboutissant à un emplacement, relativement à un point de départ déterminé par le contexte.
-
Quelques exemples (note: les symboles en italique doivent être
remplacés par quelque chose provenant du document):
Syntaxe normale Syntaxe abrégée Signification child::UneBalise UneBalise sélectionne tous les sous-éléments définis à l'aide de la balise en question child::UneBalise[position()=i] UneBalise[i] sélectionne le i-ème sous-élément défini à l'aide de la balise en question child::* * sélectionne tous les sous-éléments child::text() text() sélectionne tous les descendants directs de type texte simple child::node() sélectionne tous les descendants directs, qu'ils représentent des sous-éléments, des attributs ou du texte simple attribute::UnNom @UnNom sélectionne l'attribut portant le nom indiqué attribute::* @* sélectionne tous les attributs définis dans le contexte courant descendant::UneBalise .//UneBalise sélectionne tous les descendants de l'élément courant définis à l'aide de la balise en question ancestor::UneBalise sélectionne tous les ancêtres de l'élément courant définis à l'aide de la balise en question self::UneBalise sélectionne le noeud courant s'il est défini à l'aide de la balise en question, sinon ne sélectionne rien following-sibling::x sélectionne tous les éléments définis avec la balise x, qui se trouvent après le noeud courant et qui sont les descendants directs du même parent que le noeud courant preceding-sibling::x sélectionne tous les éléments définis avec la balise x, qui se trouvent avant le noeud courant et qui sont les descendants directs du même parent que le noeud courant child::x="y" x="y" sélectionne tous les sous-éléments définis à l'aide de la balise x et dont le contenu est la chaîne de caractères y parent::node() .. sélectionne l'ancêtre immédiat (parent) / sélectionne la racine du document (qui est le parent de l'élément constituant le document) Ces fragments peuvent être combinés. Exemples:
Syntaxe Syntaxe abrégée Signification child::x/descendant::y x//y sélectionne les éléments définis avec la balise y parmi les descendants des éléments définis avec la balise x qui sont eux-mêmes descendants directs du noeud courant child::*/child::x */y sélectionne les descendants de niveau 2 du noeud courant qui sont définis avec la balise x /descendant::x //x sélectionne tous les éléments définis avec la balise x dans le document courant child::*[attribute::a="UneValeur"][position()=2] *[@a="UneValeur"][2] sélectionne le deuxième descendant direct à avoir un attribut nommé a est dont la valeur est UneValeur child::x[child::y] x[y] sélectionne, parmi les descendants directs définis avec la balise x, ceux ayant au moins un descendant direct défini avec la balise y. /descendant::*="x"[position()=1] //*="x"[1] sélectionne le premier noeud dont le contenu est x D'une manière générale, expr1[expr2] permet de sélectionner les noeuds répondants au critère de expr1 pour lesquels le critère expr2 s'applique.
XPointer
En plus de la notation offerte par XPath, il y a différentes façons de repérer un emplacement au sein d'un document XML:
-
Quand il s'agit d'un élément complet, avec ses attributs et
son contenu:
- Si un identificateur est associé à un élément à l'aide de l'attribut ID, on peut y faire référence à l'aide de la notation xpointer(id("UnIdentificateur")), qui peut être abrégée UnIdentificateur.
- En utilisant la nature hiérarchique d'un document XML, on repère à chaque niveau de la hiérarchie la position (valeur numérique) de l'élément menant à l'emplacement que l'on veut désigner. On sépare chaque niveau par le caractère / et le @ sert à indiquer que ce qui suit est un attribut. L'élément racine est donc désigné par /1. On peut combiner cette notation avec la précédente (identificateurs). Ainsi, UnIdentificateur/3/2@x permet de désigner l'attribut x du deuxième sous-élément du troisième sous-élément de l'élément portant l'identificateur UnIdentificateur.
-
Quand il s'agit d'un point précis au sein du contenu d'un
élément:
-
On utilise la notation vue au point précédent pour repérer
un élément, suivie d'un nombre entier positif ou nul entre
[], pour repérer un point précis au sein de l'élément
en question.
- Si l'élément désigné a un contenu simple, la valeur doit être comprise dans l'intervalle 0..n (où n est le nombre de caractères du contenu de l'élément désigné); 0 indique le point se trouvant juste avant le premier caractère; une valeur positive i indique le point se trouvant juste après le i-ème caractère.
- Si l'élément a des sous-éléments, le nombre doit être compris entre 0 et n (où n est le nombre de sous-éléments). 0 indique .le point se trouvant juste avant le premier élément; une valeur positive i indique le point se trouvant juste après le i-ème sous-élément.
-
On utilise la notation vue au point précédent pour repérer
un élément, suivie d'un nombre entier positif ou nul entre
[], pour repérer un point précis au sein de l'élément
en question.
-
Quand il s'agit d'un intervalle compris entre deux points précis:
-
généralement le résultat de l'évaluation d'une
fonction. Par exemple:
xpointer(id("chap1")/range-to(id("chap2")))
représente le contenu d'un document XML commençant à l'élément dont l'identificateur est chap1 et se terminant à l'élément dont l'identificateur est chap2.
- les extrémités de l'intervalle ne sont pas nécessairement dans le même élément et l'ntervalle peut très bien ne couvrir que partiellement certains éléments.
-
généralement le résultat de l'évaluation d'une
fonction. Par exemple:
Voyons quelques exemples concrets.
- XML Linking Language (XLink) - copie locale du 20.12.2000
- XML Base
- XML Pointer Language (XPointer) - copie locale du 8.01.2001
- XML Path Language (XPath) - copie locale du 16.11.1999
- XML Linking: State of the Art, par Eve Maler, Sun Microsystems XML Technology Center