Comment puis-je vérifier si une valeur de nœud est un nombre à l'aide de XPath?
Des idées?
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>
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
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 :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 etnumber(false)
0.Chaque fois
$v
qu'il ne peut pas être utilisé comme un nombre,number($v)
NaN estet 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.la source
number($v) = number($v)
produit un résultat différentnumber($v) = $v
?number($v) = number($v)
produit un résultat différentnumber($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?Il existe un opérateur de test de type incroyable dans XPath 2.0 que vous pouvez utiliser:
la source
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 ontNotez 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. Pourtantnumber()
, retournerait de la valeurNaN
.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
la source
Celui que j'ai trouvé très utile est le suivant:
la source
Vous pouvez toujours utiliser quelque chose comme ceci:
castable est documenté par le W3C ici .
la source
J'ai eu affaire à 01 - qui est un numérique.
string(number($v)) != string($v)
fait la ségrégationla source