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