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?

Pruebe el valor contra NaN :

   

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

    

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.

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

    

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

    

El que encontré muy útil es el siguiente:

         

Siempre puedes usar algo como esto:

 string(//Sesscode) castable as xs:decimal 

el W3C documenta el moldeo aquí .