web-dev-qa-db-fra.com

Comment savoir si la variable a une valeur ou non dans XSLT

Je crée un fichier XSLT. J'ai une variable qui prend la valeur du fichier XML. Mais il peut arriver qu'il n'y ait pas de référence dans le xml pour la valeur et qu'à ce moment-là, la variable XSL renvoie False/None (ne sait pas). il n'y a pas de valeur pour la variable, utilisez celle par défaut. Comment faire ça ?

11
DSS

Avec les quelques détails donnés dans la question, le test le plus simple que vous puissiez faire est le suivant:

<xsl:if test="$var">
    ...
</xsl:if>

Vous pouvez également utiliser xsl:choose si vous souhaitez fournir une sortie pour le cas contraire:

<xsl:choose>
    <xsl:when test="not($var)"> <!-- parameter has not been supplied -->
</xsl:when>
    <xsl:otherwise> <!--parameter has been supplied --> </xsl:otherwise>
</xsl:choose>

Le deuxième exemple traitera également correctement le cas où la variable ou le paramètre n’a pas été fourni avec une valeur réelle, c’est-à-dire égale à la chaîne vide. Cela fonctionne car not('') renvoie true.

24
Dirk Vollmar

Vous n'avez pas expliqué ce que vous voulez dire par "n'a aucune valeur". Voici une solution générique :

not($v) and not(string($v))

Cette expression est évaluée à true() si et seulement $v "n'a pas de valeur".

Les deux conditions doivent être remplies , car une chaîne $v définie par '0' a une valeur, mais not($v) est true().

Dans XSLT 1.0, l'utilisation d'une valeur par défaut peut être obtenue de différentes manières si la "valeur" est un ensemble de nœuds ou si la valeur est un scalaire (tel qu'une chaîne, un nombre ou un booléen).

@Alejandro a fourni un moyen d'obtenir une valeur par défaut si une variable supposée contenir un ensemble de nœuds est vide.

Si la variable est supposée contenir un scalaire, l'expression suivante renvoie sa valeur (si elle a une valeur) ou (sinon) la valeur par défaut souhaitée:

concat($v, substring($default, 1 div (not($v) and not(string($v)))))
14
Dimitre Novatchev

Vous pouvez utiliser string-length pour vérifier si une variable appelée $reference par exemple contient quelque chose.

<xsl:choose>

  <xsl:when test="string-length($reference) > 0">
    <xsl:value-of select="$reference" />
  </xsl:when>

  <xsl:otherwise>
    <xsl:text>some default value</xsl:text>
  </xsl:otherwise>

</xsl:choose>

Si nécessaire, utilisez normalize-space aussi.

4
ceving

D'abord, toutes les variables ont des valeurs, car XSLT appartient au paradigme déclaratif: il n'y a pas d'instruction d'asignation, mais lorsque vous déclarez la variable, vous déclarez également l'expression pour sa relation de valeur.

Si cette valeur correspond à un type de données d'ensemble de noeuds (d'après votre question), vous devez alors rechercher un ensemble vide de noeuds au cas où rien n'aurait été sélectionné. La valeur booléenne effective pour un ensemble de nœuds vides est false. Donc, comme @ 0xA3 a répondu: test="$node-set".

Tu as écrit:

S'il n'y a pas de valeur pour la variable, utilisez celle par défaut. Comment faire ça ?

Cela dépend du type de données que vous recherchez.

Supposons le type de données d'ensemble de noeuds: si vous voulez la valeur $ node-set-1 ou $ node-set-2 si $ node-set-1 est vide, utilisez:

$node-set-1|$node-set-2[not($node-set-1)]
0
user357812

J'ai essayé beaucoup de solutions de SO, ma dernière solution a été empruntée à @ dimitre-novatchev, mais celle-ci ne fonctionne pas à chaque fois. Récemment, j'ai trouvé une solution supplémentaire issue d'une recherche google aléatoire, que l'on pensait partager avec la communauté.

Afin de vérifier la valeur d'une variable vide, nous pouvons déclarer une variable vide et comparer sa valeur à la condition de test. Voici l'extrait de code:

<xsl:variable name="empty_string"/>
<xsl:if test="testVariableValue != $empty_string">
...
</xsl:if>

Ici, testVariableValue contient la valeur de la nouvelle variable à tester pour le scénario vide. J'espère que cela aiderait à tester l'état de variable vide.

0
Sudip7