XPath тест, если значение узла-номер
Как я могу проверить, является ли значение узла числом с помощью XPath?
какие идеи?
6 ответов:
проверьте значение против Нэн:
<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 не равен любому другому значению, даже самому себе.
таким образом, приведенное выше выражение справедливо только для
$v
значение которого можно использовать как число, а в противном случае-false.
в XPath 2.0 есть удивительный оператор тестирования типа, который вы можете использовать:
<xsl:if test="$number castable as xs:double"> <!-- implementation --> </xsl:if>
Я не пытаюсь дать еще одно альтернативное решение, но "мета взгляд" на эту проблему.
ответы, уже предоставленные Одедом и Дмитрием Новачевым, верны, но то, что люди действительно могут означать с фразой "значение-это число", как бы я это сказал, открыто для интерпретации.
в некотором смысле все сводится к этому странному звучащему вопросу: " как вы хотите выразить свои числовые значения?"
функция XPath
number()
процессы числа, которые имеют
- возможные начальные или конечные пробелы
- предыдущий символ только при отрицательных значениях
- точка в качестве десятичного разделителя (в качестве опции для целых чисел)
- все остальные символы из диапазона [0-9]
обратите внимание, что это не включает в себя выражения для числовых значений
- выражается в экспоненциальной форме (например, 12.3E45)
- может содержать знак для положительных значений
- есть различие между положительным и отрицательным нуль
- включить значение для положительной или отрицательной бесконечности
это не просто составленные критерии. Элемент с содержимым, которое в соответствии со схемой является допустимым
xs:float
значение может содержать любую из вышеупомянутых характеристик. И все жеnumber()
вернет значениеNaN
.так ответьте на ваш вопрос "Как я могу проверить с XPath, если значение узла номер?"либо" использовать уже упомянутые решения с помощью
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 здесь.