Clés et documents
Stéphane Bonhomme <[email protected]> Thu, 18 Jan 2007 19:32:54 +0100
| Newsgroups | gmane.text.xml.french.tech |
|---|---|
| Message-ID | <[email protected]> |
Bonjour;
J'ai une petite question concernant les clés xslt 1.0 et le traitement
multi-documents :
Dans un traitement utilisant la fonction document(), on peut utiliser
les clés pour adresser des noeuds d'un autre document (par exemple le
doc source de la transformation) : La spec xslt 1 (section 12.2) dit
explicitement :
"The *key <http://www.w3.org/TR/xslt#function-key>* can be used to
retrieve a key from a document other than the document containing the
context node. For example, suppose a document contains bibliographic
references in the form |<bibref>XSLT</bibref>|, and there is a separate
XML document |bib.xml| containing a bibliographic database with entries
in the form:"
(suivi d'un exemple illustrant le concept)
Pourtant, dans la pratique il semble qu'on ne peut pas utiliser les clés
définies par xsl:key sur le document xsl source de la transformation,
j'ai testé avec plusieurs processeurs (libxslt, xalan et saxon) et tous
ont le même comportement : il semble impossible d'adresser des clés
définies sur un document quand le noeud courant appartient à un autre
document.
Voici un petit exemple qui illustre mon propos :
fichier xml source :
<a>
<ref p="1" v="A"/>
<ref p="2" v="B"/>
<ref p="3" v="C"/>
<ref p="4" v="D"/>
</a>
J'ai un fichier xml complémentaire qui permet de filtrer les elements
ref à afficher en fonction de la valeur de l'attribut p :
filtre.xml :
<filtre>
<ok vp="1"/>
<ok vp="3"/>
</filtre>
j'écrit un xsl qui m'affiche les couple de valeurs p=v pour les <ref> du
doc source si et seulement si le filtre a un element ok abec un attribut
vp égal a l'attribut p :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key match="/a/ref" name="cle" use="@p"/>
<xsl:template match="a">
<xsl:for-each select="document('filtre.xml')/filtre/ok">
<xsl:value-of select="@vp"/> = <xsl:value-of
select="key('cle',@vp)/@v"/>;
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Je m'attends a avoir comme résultat :
1=A;
3=C;
et pourtant j'obtiens :
1=;
3=;
Qui se trompe ? les trois processeurs xslt, ou moi quand je lis la spec ?
--
Stéphane Bonhomme -- Exselt Services
Formations, Conseil et Réalisations en Ingénierie Documentaire,
Technologies Web et Logiciels Libres
[email protected] - http://www.exselt.com
04 57 39 30 78 / 06 88 57 27 08