Как проверить, является ли значение node числом с помощью XPath?
Любые идеи?
Как проверить, является ли значение node числом с помощью XPath?
Любые идеи?
Проверьте значение 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>
Самый короткий способ проверить, может ли значение, содержащееся в переменной $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 в противном случае.
В XPath 2.0 вы можете использовать классный тестовый оператор:
<xsl:if test="$number castable as xs:double">
<!-- implementation -->
</xsl:if>
Я не пытаюсь предоставить еще одно альтернативное решение, но "мета-представление" этой проблемы.
Ответы, уже предоставленные Одедом и Димитрием Новачевым, верны, но то, что действительно могут означать люди с фразой "значение - это число", - как бы я это сказал, открытое для интерпретации.
В любом случае все это приходит к этому причудливому звуковому вопросу: "как вы хотите выразить свои числовые значения?"
Функция XPath number()
обрабатывает числа с
Обратите внимание, что это не включает выражения для числовых значений, которые
Это не просто составленные критерии. Элемент с содержимым, который соответствует схеме, действительное значение 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>
Я нашел очень полезным следующее:
<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>
Вы всегда можете использовать что-то вроде этого:
string(//Sesscode) castable as xs:decimal
castable документируется W3C здесь.
Я имел дело с 01 - это числовое значение.
string(number($v)) != string($v)
делает сегрегацию