1 votes

Comment créer des variables dans XSLT qui ne sont pas des fragments de document ?

Considérons le modèle XSLT 2.0 suivant

<xsl:template match="/">
    <xsl:variable name="var1">
        <elem>1</elem>
        <elem>2</elem>
        <elem>3</elem>
    </xsl:variable>
    <xsl:text>var1 has </xsl:text>
    <xsl:value-of select="count($var1)"/>
    <xsl:text>elements.
    </xsl:text>

    <xsl:variable name="var2" select="$var1/elem[position() &gt; 1]"/>
    <xsl:text>var2 has </xsl:text>
    <xsl:value-of select="count($var2)"/>
    <xsl:text>elements.
    </xsl:text>
</xsl:template>

La sortie de ce modèle est

var1 has 1 elements
var2 has 2 elements

La première ligne produit 1 (et non pas, comme je l'avais d'abord prévu, 3) car var1 est un fragment de document qui contient le <elem> en tant qu'enfants. J'en viens maintenant à mes questions :

Comment puis-je créer une variable qui ne contient pas de fragment de document ? Je pourrais le faire comme je l'ai fait avec var2 en omettant seulement le prédicat. Mais peut-être y a-t-il un moyen sans utiliser une deuxième variable. Ou, comme alternative : Comment puis-je conserver le fragment de document dans une variable tout en filtrant certains éléments ?

Informations générales : Je vais utiliser le contenu de la variable dans une fonction récursive qui vérifie le premier élément de la variable var1 pour certains critères. Si les critères sont remplis ou si la liste d'éléments est vide, elle renvoie une valeur. Sinon, elle s'appelle elle-même avec le premier élément de la liste de var1 supprimé (comme je le fais dans var2 ). Lorsque vous utilisez var1 comme paramètre qui contient un fragment de document, les expressions XPath de mon modèle ne correspondront pas.

1voto

Dimitre Novatchev Points 147842

Comment puis-je créer une variable qui fait ne contient pas de fragment de document ?

Utilisez :

<xsl:variable name="var1" as="element()*"> 
    <elem>1</elem> 
    <elem>2</elem> 
    <elem>3</elem> 
</xsl:variable> 

Comment puis-je préserver le document dans une variable tout en filtrant certains éléments ?

Si vous avez :

<xsl:variable name="var1"> 
    <elem>1</elem> 
    <elem>2</elem> 
    <elem>3</elem> 
</xsl:variable> 

Utilisez :

  <xsl:variable name="var2">
    <xsl:copy-of select="$var1/*[. mod 2 = 1]"/>
  </xsl:variable>

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