Comment puis-je vérifier si une valeur de nœud est un nombre à l'aide de XPath?
Des idées?
Comment puis-je vérifier si une valeur de nœud est un nombre à l'aide de XPath?
Des idées?
Réponses:
Testez la valeur par rapport à NaN :
<xsl:if test="string(number(myNode)) != 'NaN'">
<!-- myNode is a number -->
</xsl:if>
Ceci est une version plus courte (merci @Alejandro ):
<xsl:if test="number(myNode) = myNode">
<!-- myNode is a number -->
</xsl:if>
Required item type of first operand of '=' is numeric; supplied value has item type xs:string;
), la solution de Dimitre fonctionne bien cependant.
Le moyen le plus court possible de tester si la valeur contenue dans une variable $v
peut être utilisée comme un nombre est :
number($v) = number($v)
Il vous suffit de remplacer ce qui $v
précède par l'expression dont vous souhaitez tester la valeur.
Explication :
number($v) = number($v)
est évidemment vrai, si $v
est un nombre ou une chaîne qui représente un nombre.
C'est également vrai pour une valeur booléenne, car a number(true())
vaut 1 et number(false)
0.
Chaque fois $v
qu'il ne peut pas être utilisé comme un nombre, number($v)
NaN est
et NaN n'est égal à aucune autre valeur, même à lui-même.
Ainsi, l'expression ci-dessus n'est vraie que pour $v
dont la valeur peut être utilisée comme un nombre, et fausse sinon.
number($v) = number($v)
produit un résultat différent number($v) = $v
?
number($v) = number($v)
produit un résultat différent number($v) = $v
? Cela découle sans doute de ce que vous avez écrit, mais je ne vois pas où vous avez abordé cette question explicitement. Désolé si je suis dense. IOW, votre solution et celle de @ Oded / @ Alejandro donnent-elles toujours les mêmes résultats?
Je n'essaye pas de fournir une autre solution alternative, mais une "méta-vue" à ce problème.
Les réponses déjà fournies par Oded et Dimitre Novatchev sont correctes, mais ce que les gens pourraient vraiment vouloir dire par l'expression «la valeur est un nombre» est, comment dirais-je, ouvert à l'interprétation.
D'une certaine manière, tout se résume à cette question étrange: "comment voulez-vous exprimer vos valeurs numériques?"
La fonction XPath number()
traite les nombres qui ont
Notez que cela n'inclut pas les expressions pour les valeurs numériques qui
Ce ne sont pas seulement des critères inventés. Un élément dont le contenu est selon le schéma une xs:float
valeur valide peut contenir l'une des caractéristiques mentionnées ci-dessus. Pourtant number()
, retournerait de la valeur NaN
.
Alors répondez à votre question "Comment puis-je vérifier avec XPath si une valeur de nœud est un nombre?" est soit "Utiliser les solutions déjà mentionnées en utilisant number()
" ou "avec une seule expression XPath 1.0, vous ne pouvez pas". Pensez aux formats de nombres possibles que vous pourriez rencontrer et, si nécessaire, écrivez une sorte de logique pour la validation / l'analyse des nombres. Dans le traitement XSLT, cela peut être fait avec quelques modèles supplémentaires appropriés, par exemple.
PS. Si vous ne vous souciez que des nombres non nuls, le test le plus court est
<xsl:if test="number(myNode)">
<!-- myNode is a non-zero number -->
</xsl:if>
NaN
valeur du type de données numérique n'est pas égale à une valeur numérique et, à des fins de comparaison, si au moins un argument est des données numériques tapées, l'autre est converti en nombre, c'est le test de nombre le plus court:number(MyNode)=MyNode