XPath, если значение node равно числу

Как проверить, является ли значение node числом с помощью XPath?

Любые идеи?

Ответ 1

Проверьте значение NaN:

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

Это более короткая версия (спасибо @Alejandro):

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

Ответ 2

Самый короткий способ проверить, может ли значение, содержащееся в переменной $v, использоваться как число:

number($v) = number($v)

Вам нужно только подставить $v выше выражение, значение которого вы хотите проверить.

Объяснение

number($v) = number($v), очевидно, истинно, если $v - число или строка, представляющая число.

Это верно и для логического значения, поскольку a number(true()) равно 1 и number(false) равно 0.

Когда $v не может использоваться как число, тогда number($v) является NaN

и NaN не равно никакому другому значению, даже самому себе.

Таким образом, указанное выше выражение истинно только для $v, значение которого может использоваться как число, а false в противном случае.

Ответ 3

В XPath 2.0 вы можете использовать классный тестовый оператор:

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

Ответ 4

Я не пытаюсь предоставить еще одно альтернативное решение, но "мета-представление" этой проблемы.

Ответы, уже предоставленные Одедом и Димитрием Новачевым, верны, но то, что действительно могут означать люди с фразой "значение - это число", - как бы я это сказал, открытое для интерпретации.

В любом случае все это приходит к этому причудливому звуковому вопросу: "как вы хотите выразить свои числовые значения?"

Функция XPath number() обрабатывает числа с

  • возможные ведущие или конечные пробелы
  • знак предшествующего знака только по отрицательным значениям
  • dot как разделитель десятичных чисел (необязательно для целых чисел)
  • все остальные символы из диапазона [0-9]

Обратите внимание, что это не включает выражения для числовых значений, которые

  • выражены в экспоненциальном виде (например, 12.3E45)
  • может содержать знак символа для положительных значений
  • имеют различие между положительным и отрицательным нулями
  • включить значение для положительной или отрицательной бесконечности

Это не просто составленные критерии. Элемент с содержимым, который соответствует схеме, действительное значение xs:float может содержать любую из вышеупомянутых характеристик. Тем не менее number() возвращает значение NaN.

Итак, ответьте на свой вопрос: "Как я могу проверить с помощью XPath, если значение node является номером?" либо "Использовать уже упомянутые решения, используя number()" или "с одним выражением XPath 1.0, вы не можете". Подумайте о возможных форматах чисел, с которыми вы можете столкнуться, и, если необходимо, напишите какую-то логику для валидации/парсинга чисел. В рамках обработки XSLT это можно сделать с помощью нескольких подходящих дополнительных шаблонов, например.

PS. Если вас интересуют только ненулевые номера, самый короткий тест

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

Ответ 5

Я нашел очень полезным следующее:

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

Ответ 6

Вы всегда можете использовать что-то вроде этого:

string(//Sesscode) castable as xs:decimal

castable документируется W3C здесь.

Ответ 7

Я имел дело с 01 - это числовое значение.

string(number($v)) != string($v) делает сегрегацию