¿Cómo puedo verificar si un valor de nodo es un número usando XPath?
¿Algunas ideas?
¿Cómo puedo verificar si un valor de nodo es un número usando XPath?
¿Algunas ideas?
Respuestas:
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>
Required item type of first operand of '=' is numeric; supplied value has item type xs:string;
), la solución de Dimitre funciona bien.
La forma más corta posible de probar si el valor contenido en una variable $v
se puede utilizar como un número es :
number($v) = number($v)
Solo necesita sustituir lo $v
anterior por la expresión cuyo valor desea probar.
Explicacion :
number($v) = number($v)
es obviamente cierto, si $v
es un número o una cadena que representa un número.
También es cierto para un valor booleano, porque a number(true())
es 1 y number(false)
es 0.
Siempre $v
que no se pueda usar como número, entonces number($v)
es NaN
y NaN no es igual a ningún otro valor, ni siquiera 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 falsa en caso contrario.
number($v) = number($v)
obtiene un resultado diferente number($v) = $v
?
number($v) = number($v)
obtiene un resultado diferente number($v) = $v
? Sin duda, eso se deriva de lo que escribió, pero no veo dónde se dirigió explícitamente a esta pregunta. Lo siento si estoy siendo tonto. IOW, ¿su solución y la solución de @ Oded / @ Alejandro siempre dan los mismos resultados?
No estoy tratando de proporcionar una solución alternativa más, sino una "meta vista" para este problema.
Las respuestas ya proporcionadas 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 interpretación.
En cierto modo, todo se reduce a esta pregunta que suena extraña: "¿cómo quieres expresar tus valores numéricos?"
La función XPath number()
procesa números que tienen
Tenga en cuenta que esto no incluye expresiones para valores numéricos que
Estos no son solo criterios inventados. Un elemento con contenido que, según el esquema, es un xs:float
valor válido puede contener cualquiera de las características mencionadas anteriormente. Sin embargo number()
, devolvería valor NaN
.
Entonces, responda a su pregunta "¿Cómo puedo verificar con XPath si el valor de un nodo es un número?" es "Use las soluciones ya mencionadas usando number()
" o "con una sola expresión XPath 1.0, no puede". Piense en los posibles formatos de números que puede 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 pocas plantillas adicionales adecuadas, por ejemplo.
PD. Si solo te preocupan 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>
NaN
valor del tipo de datos numéricos no es igual a ningún valor numérico y para la comparación, si al menos un argumento son datos numéricos escritos, el otro se convierte en número, esta es la prueba de número más corta:number(MyNode)=MyNode