web-dev-qa-db-fra.com

<xsl: variable> Imprime la valeur de la variable XSL à l'aide de <xsl: value-of>

J'essaie de sortir la valeur de chaîne littérale d'une variable, après qu'elle soit définie selon qu'un nœud existe ou non. Je pense que la logique de vérification de l'état est correcte. Mais il ne sort pas les valeurs ...

<xsl:variable name="subexists"/>

<xsl:template match="class">
<xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
<xsl:choose>
    <xsl:when test="joined-subclass">
        <xsl:variable name="subexists" select="'true'"/>
    </xsl:when>
    <xsl:otherwise>
        <xsl:variable name="subexists" select="'false'"/>
    </xsl:otherwise>
</xsl:choose>
subexists:  <xsl:value-of select="$subexists" />

Je veux qu'il produise la chaîne littérale de "vrai" ou de "faux". Mais il ne produit rien. Veuillez aider! Je vous remercie!!!

17
tomato

Dans ce cas, aucune condition n'est nécessaire pour définir la variable .

Cette expression XPath à une ligne:

boolean(joined-subclass)

est true() uniquement lorsque l'enfant du nœud actuel, nommé joined-subclass existe et c'est false() sinon.

La feuille de style complète est :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes"/>

 <xsl:template match="class">
   <xsl:variable name="subexists"
        select="boolean(joined-subclass)"
   />

   subexists:  <xsl:text/>
   <xsl:value-of select="$subexists" />
 </xsl:template>
</xsl:stylesheet>

Notez , que l'utilisation de la fonction XPath boolean() = dans cette expression consiste à convertir un noeud (ou son absence) en l'une des valeurs booléennes true() ou false().

21
Dimitre Novatchev

Votre principal problème est de penser que la variable que vous avez déclarée en dehors du modèle est la même variable étant "définie" à l'intérieur de l'instruction Choose. Ce n'est pas ainsi que XSLT fonctionne, la variable ne peut pas être réaffectée. C'est quelque chose de plus comme ce que vous voulez:

<xsl:template match="class">
  <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
  <xsl:variable name="subexists">
    <xsl:choose>
      <xsl:when test="joined-subclass">true</xsl:when>
      <xsl:otherwise>false</xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
  subexists:      <xsl:value-of select="$subexists" />
</xsl:template>

Et si vous avez besoin que la variable ait une portée "globale", déclarez-la en dehors du modèle:

<xsl:variable name="subexists">
  <xsl:choose>
     <xsl:when test="/path/to/node/joined-subclass">true</xsl:when>
     <xsl:otherwise>false</xsl:otherwise>
  </xsl:choose>
</xsl:variable>

<xsl:template match="class">
   subexists:      <xsl:value-of select="$subexists" />
</xsl:template>
7
eddiegroves

Dans XSLT le même <xsl:variable> ne peut être déclaré qu'une seule fois et ne peut recevoir une valeur que lors de sa déclaration. Si plusieurs variables sont déclarées en même temps, il s'agit en fait de variables différentes et de portée différente.

Par conséquent, la façon d'atteindre le paramètre conditionnel souhaité de la variable et de produire sa valeur est la suivante:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes"/>

    <xsl:template match="class">
    <xsl:variable name="subexists">
            <xsl:choose>
                <xsl:when test="joined-subclass">true</xsl:when>
                <xsl:otherwise>false</xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
        subexists:  <xsl:text/>    
        <xsl:value-of select="$subexists" />
    </xsl:template>
</xsl:stylesheet>

Lorsque la transformation ci-dessus est appliquée au document XML suivant :

<class>
 <joined-subclass/>
</class>

le résultat souhaité est produit :

    subexists:  true
6
Dimitre Novatchev