99 votes

Xpath test si le nombre est

Comment je peux vérifier avec xpath si e la valeur du nœud est le nombre?

Des idées?

134voto

Oded Points 271275

Test de la valeur par rapport à NaN:

<xsl:if test="string(number(myNode)) != 'NaN'">
    <!-- myNode is a number -->
</xsl:if>

C'est une version plus courte (merci @Alejandro):

<xsl:if test="number(myNode) = myNode">
    <!-- myNode is a number -->
</xsl:if>

75voto

Dimitre Novatchev Points 147842

Le plus court chemin possible de tester si la valeur contenue dans une variable $v peut être utilisé comme un nombre est:

number($v) = number($v)

Vous avez seulement besoin de remplacer le $v - dessus avec l'expression dont la valeur que vous voulez tester.

Explication:

number($v) = number($v) est évidemment vrai, si $v est un nombre ou une chaîne de caractères qui représente un nombre.

Il est vrai également pour une valeur booléenne, parce qu'un number(true()) est 1 number(false) est de 0.

Chaque fois qu' $v ne peut pas être utilisé comme un nombre, alors number($v) est NaN

et NaN n'est pas égale à toute autre valeur, même à lui-même.

Ainsi, l'expression ci-dessus est vrai que pour $v dont la valeur peut être utilisé comme un certain nombre, et false sinon.

22voto

serhiy.h Points 281

Il y a une superbe type opérateur de test dans XPath 2.0, vous pouvez utiliser:

<xsl:if test="$number castable as xs:double">
    <!-- implementation -->
</xsl:if>

15voto

jasso Points 7802

Je ne suis pas en essayant de fournir une encore une autre solution de rechange, mais un "méta-vue" à ce problème.

Les réponses déjà fournies par Oded et Dimitre Novatchev sont corrects mais ce que les gens pourraient dire avec l'expression "la valeur est un nombre" est, comment pourrais-je le dire, ouverte à l'interprétation.

En un sens, tout vient à cette étrange consonance question: "comment voulez-vous exprimer vos valeurs numériques?"

Fonction XPath number() des numéros de processus qui ont

  • possible espaces avant ni après
  • précédant du signe uniquement sur les valeurs négatives
  • point comme séparateur décimal (facultatif pour les entiers)
  • tous les autres personnages de la gamme [0-9]

Notez que ceci n'inclut pas les expressions pour les valeurs numériques que

  • sont exprimés en forme exponentielle (par exemple 12.3E45)
  • peut contenir du signe des valeurs positives
  • avoir une distinction entre le positif et le négatif, zéro
  • inclure la valeur positive ou négative de l'infini

Ce ne sont pas seulement composée de critères. Un élément avec un contenu qui est selon un schéma valide xs:float de la valeur peut contenir les caractéristiques mentionnées ci-dessus. Pourtant, number() serait de retour la valeur NaN.

Donc la réponse à votre question "Comment je peux vérifier avec XPath si un nœud de valeur est le nombre?" est "Utilisez déjà mentionné solutions à l'aide d' number()" ou "avec une seule expression XPath 1.0, vous ne pouvez pas". Pensez au nombre de formats que vous pourriez rencontrer, et si nécessaire, écrire une sorte de logique de validation/numéro de l'analyse. Dans XSLT, ce qui peut être fait avec quelques adapté modèles supplémentaires, par exemple.

PS. Si vous ne se soucient non-zéro, les nombres, le test est plus court

<xsl:if test="number(myNode)">
    <!-- myNode is a non-zero number -->
</xsl:if>

10voto

jkpd Points 71

Celui que j'ai trouvé très utile est le suivant:

<xsl:choose>
  <xsl:when test="not(number(myNode))">
      <!-- myNode is a not a number or empty(NaN) or zero -->      
  </xsl:when>
  <xsl:otherwise>
      <!-- myNode is a number (!= zero) -->        
  </xsl:otherwise>
</xsl:choose>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X