Considérez cet exemple simple d'élément xml :
<parent foo="1" bar="2" foobar="3">
<child/>
</parent>
Dans le fichier xsl, je suis dans le contexte du "parent" (c'est-à-dire dans le <template match="parent">). Je veux sélectionner un ensemble de nœuds (dans l'exemple, un seul attribut) sur la base d'une variable de type chaîne. Par exemple, je veux sélectionner un ensemble de nœuds qui correspond à $attribute-name. Je vais montrer mon exemple xsl raté et vous comprendrez probablement ce que j'essaie de faire.
<xsl:template match="parent">
<xsl:call-template name="print-value-of">
<xsl:with-param name="attribute-type" select="'foo'"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="print-value-of">
<xsl:param name="attribute-type"/>
<xsl:value-of select="$attribute-type"/>
</xsl:template>
Ceci imprime la sortie :
foo
Ce que j'ai d'abord INTENTIONné de faire (mais je me rends compte que ce n'est pas ce qu'il devrait faire) est :
- évaluer la variable attribut - type (ou param, si vous voulez être pointilleux) comme la chaîne 'foo'.
- appeler le value-of comme si j'avais appelé <xsl:value-of select="foo"/>
C'est-à-dire que ce que je voulais qu'il imprime était.. :
1
LA QUESTION : Comment puis-je obtenir ce comportement ?
Avis : Je suis conscient du fait que je, en ce cas simple En effet, on pourrait passer le nœud d'attribut réel en tant que paramètre (par exemple, <xsl:with-param name="attribute" select="foo"/>). Mais ce n'est pas la solution que je recherche. J'ai besoin de transmettre uniquement des informations sur le type d'attribut (ou le nom de l'attribut si vous préférez l'appeler ainsi).
Ce que j'essaie de faire, en fait, c'est de créer un modèle de fonction générale qui peut.. :
- Appel d'une fonction (call-template) avec le type d'attribut comme paramètre
- Dans la fonction, je fais une série d'opérations qui me donnent un ensemble de nœuds, stocké dans une variable.
- additionner tous les attributs des éléments de l'ensemble de nœuds, qui sont du type d'attribut sélectionné précédemment.
<EDIT>
Je ne peux utiliser que XSLT 1.0, donc les solutions 1.0 sont de loin préférables !
</EDIT>
<EDIT2>
Une question complémentaire sur un thème similaire : Est-il également possible de créer des attributs d'un avec le nom/type spécifié par une variable de type chaîne ? Par exemple
<xsl:attribute name="$attribute-type"/>
En procédant comme dans la ligne ci-dessus, $attribute-type sera le nom littéral de l'attribut dans la sortie xml. Au lieu de cela, je voudrais qu'il évalue la variable et donne la valeur évaluée comme nom.
</EDIT2>