online - Prueba de XPath si el valor del nodo es número
xpath predicate (6)
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>
¿Cómo puedo verificar si un valor de nodo es un número usando XPath?
¿Algunas ideas?
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>
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?"
El number()
función XPath number()
procesa números que tienen
- posible espacio en blanco anterior o posterior
- carácter de signo precedente solo en valores negativos
- dot 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, un valor de xs:float
válido puede contener cualquiera de las características mencionadas anteriormente. Sin embargo, 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 soluciones ya mencionadas utilizando el number()
" o "con una sola expresión XPath 1.0, no se puede". Piense en los posibles formatos de números que pueda encontrar, y si es necesario, escriba algún tipo de lógica para la validación / análisis de números. 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>
Pruebe el valor contra NaN :
<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>
Siempre puedes usar algo como esto:
string(//Sesscode) castable as xs:decimal
el W3C documenta el moldeo here .
La manera más corta posible de probar si el valor contenido en una variable $v
se puede usar como un número es :
number($v) = number($v)
Solo necesita sustituir el $v
anterior 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 un number(true())
es 1 y el number(false)
es 0.
Siempre que $v
no se pueda usar como un número, entonces el 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 se puede usar como un número, y de lo contrario es falso.