Pregunta Prueba de XPath si el valor del nodo es número


¿Cómo puedo verificar si un valor de nodo es un número usando XPath?

¿Algunas ideas?


75
2017-10-04 10:28


origen


Respuestas:


Pruebe el valor contra Yaya:

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

Esta es una versión más corta (gracias @ Alejandro)

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

102
2017-10-04 10:35



La forma más corta posible de comprobar si el valor contenido en una variable $v se puede utilizar como un número es:

number($v) = number($v)

Solo necesitas sustituir el $v arriba con la expresión cuyo valor desea probar.

Explicación:

number($v) = number($v) es obviamente cierto, si $v es un número o una cadena que representa un número.

Es cierto también para un valor booleano, porque number(true()) es 1 y number(false) es 0.

Cuando $v no se puede usar como un número, luego number($v) es NaN

y NaN no es igual a ningún otro valor, incluso a sí mismo.

Por lo tanto, la expresión anterior es verdadera solo para $v cuyo valor puede usarse como un número, y falso de lo contrario.


49
2017-10-04 17:09



Hay un increíble operador de prueba de tipo en XPath 2.0 que puede usar:

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

16
2018-02-01 09:19



No estoy tratando de proporcionar una solución alternativa más, sino una "meta visualización" de este problema.

Las respuestas ya provistas por Oded y Dimitre Novatchev son correctas, pero lo que la gente realmente podría querer decir con la frase "el valor es un número" es, cómo lo diría, abierto a la interpretación.

En cierto modo, todo se reduce a esta extraña pregunta: "¿Cómo quieres expresar tus valores numéricos?"

Función XPath number() procesa los números que tienen

  • posible espacio en blanco anterior o posterior
  • personaje de signo precedente solo en valores negativos
  • punto como un separador decimal (opcional para enteros)
  • todos los demás caracteres del rango [0-9]

Tenga en cuenta que esto no incluye expresiones para valores numéricos que

  • se expresan en forma exponencial (por ejemplo, 12.3E45)
  • puede contener un carácter de signo para valores positivos
  • tener una distinción entre cero positivo y negativo
  • incluir valor para infinito positivo o negativo

Estos no son solo criterios inventados. Un elemento con contenido que está de acuerdo con el esquema es válido xs:float el valor puede contener cualquiera de las características mencionadas anteriormente. Todavía number() devolvería valor NaN.

Así que responda a su pregunta "¿Cómo puedo verificar con XPath si el valor de un nodo es el número?" es "Usar las soluciones ya mencionadas utilizando number()"o" con una única expresión XPath 1.0, no se puede ". Piense en los posibles formatos numéricos que pueda encontrar, y si es necesario, escriba algún tipo de lógica para el análisis de validación / número. Dentro del procesamiento XSLT, esto se puede hacer con algunas plantillas adicionales adecuadas, por ejemplo.

PD. Si solo te importan los números distintos de cero, la prueba más corta es

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

14
2017-10-04 18:50



El que encontré muy útil es el siguiente:

<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>

9
2018-03-02 15:54



Siempre puedes usar algo como esto:

string(//Sesscode) castable as xs:decimal

moldeable está documentado por W3C aquí.


0
2017-11-25 12:02