Comment faire référence à l'actuelle valeur du nœud dans XSL pour chaque test?
Disons que j'ai un document XML comme ceci:
<books>
<book>1110</book>
<book>1111</book>
<book>1112</book>
<book>1113</book>
</books>
Je suis en train de configurer une condition qui teste la valeur du nœud courant dans le for-each
, mais je suis en train de faire quelque chose de mal:
<xsl:for-each select="/books/book">
<xsl:if test=".[='1112']">
Success
</xsl:if>
</xsl:for-each>
Ce que je fais mal?
- .[someBoolean] est syntaxiquement invalide dans XPath 1.0.
Vous devez vous connecter pour publier un commentaire.
À l'aide de
.
peut, en effet, reportez-vous au courant (ou "contexte") nœud, mais pas de la manière dont vous l'utilisez ici. Dans XPath,.[foo]
n'est pas valide la syntaxe — vous besoin d'utiliserself::node()[foo]
à la place. Aussi, le=
opérateur a besoin de quelque chose pour correspondre contre, dans ce cas, letext()
sélecteur pour accéder au texte de l'élément de contenu:Comme indiqué dans les autres réponses, cependant, à moins que votre
for-each
est d'effectuer d'autres opérations ainsi, vous n'avez pas besoin d'effectuer une itération à tous et ne peuvent utiliser qu'if
pour accomplir la même tâche:La première chose qui est incorrecte est la syntaxe:
Il y a deux choses mal ici:
Dans les [ et ] il n'y a pas de prédicat: le "=" de l'opérateur a besoin de deux arguments, mais un seul est fourni.
.[x = y]
est encore syntaxe non valide, même si le prédicat est OK. Cela doit être spécifié comme:self::node()[condition]
La deuxième chose dans le code fourni qui peut être amélioré est le
<xsl:for-each>
instruction, ce qui n'est pas du tout nécessaire; Une seule expression XPath sera suffisant.Pour résumer, une expression XPath qui évalue à la valeur booléenne est:
Si il est vraiment nécessaire que l'état intérieur de tester la
<xsl:for-each>
enseignement, alors qu'une seule et unique expression XPath je voudrais utiliser est:Ci-dessus est une comparaison de chaîne et ne peut pas évaluer à
true()
si il y a des espaces autour. Par conséquent, une comparaison numérique peut être mieux:. = '1112'
a bien fonctionné pour moi. Merci.Tandis que Ben a répondu à votre question correctement, à l'aide de for-each est plus vraiment la mauvaise approche générale. Après tout, c'est XSLT. Donc, vous êtes plus probablement de la recherche de quelque chose comme ceci:
for-each
bloc, mais si c'est l'intégralité, il serait de loin préférable d'utiliser cette simpleif
à la place.XSLT a une fonction spécialement pour ce problème.
http://www.w3.org/TR/xslt#function-current
Essayez avec cette