4 votes

Sélection des ensembles de nœuds (attributs ou éléments) qui correspondent à un nom de variable de type chaîne de caractères

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 :

  1. évaluer la variable attribut - type (ou param, si vous voulez être pointilleux) comme la chaîne 'foo'.
  2. 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.. :

  1. Appel d'une fonction (call-template) avec le type d'attribut comme paramètre
  2. Dans la fonction, je fais une série d'opérations qui me donnent un ensemble de nœuds, stocké dans une variable.
  3. 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>

4voto

Tomalak Points 150423

Ceci sélectionne un attribut avec le nom de 'foo' .

<xsl:call-template name="print-value-of">
  <xsl:with-param name="attribute-type" select="@*[name() = 'foo']"/>
</xsl:call-template>

<xsl:template name="print-value-of">
   <xsl:param name="attribute-type"/>
   <xsl:value-of select="."/>
</xsl:template>

Vous pouvez également laisser l'option <xsl:call-template> comme il est et faites le changement dans votre modèle :

<xsl:template name="print-value-of">
  <xsl:param name="attribute-type"/>

  <xsl:value-of select="@*[name() = $attribute-type]"/>
</xsl:template>

Quoi qu'il en soit, à moins qu'il ne s'agisse d'un exemple synthétique, tout ce qui précède est une manière assez coûteuse de dire :

<xsl:value-of select="@*[name() = $attribute-type]"/>

EDITAR:

Pour créer des attributs avec un nom dynamique, utilisez :

<xsl:attribute name="{$attribute-type}">
  <xsl:value-of select="$some-value-or-expression" />
</xsl:attribute>

Notez que les accolades font que le processeur XSLT évalue leur contenu (uniquement dans les valeurs d'attributs).

Vous devez vous assurer que $attribute-type contient une chaîne de caractères qui respecte les règles de dénomination XML. Et vous devriez penser à renommer la variable en $attribute-name parce que c'est ce que c'est.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X