Как с помощью 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>
NaN
значение числового типа данных не равно никакому числовому значению, и для сравнения, если хотя бы один аргумент представляет собойnumber(MyNode)=MyNode
Required item type of first operand of '=' is numeric; supplied value has item type xs:string;
), однако решение Dimitre работает нормально.Самый короткий способ проверить, можно ли использовать значение, содержащееся в переменной
$v
, в качестве числа :Вам нужно только заменить приведенное
$v
выше выражением, значение которого вы хотите проверить.Пояснение :
number($v) = number($v)
очевидно, истинно, если$v
это число или строка, представляющая число.Это верно также для логического значения, потому что a
number(true())
равно 1 иnumber(false)
равно 0.Когда
$v
не может использоваться как число, тогдаnumber($v)
NaNи NaN не равно никакому другому значению, даже самому себе.
Таким образом, приведенное выше выражение истинно только для того
$v
, значение которого может использоваться как число, и ложно в противном случае.источник
number($v) = number($v)
дает другой результатnumber($v) = $v
?number($v) = number($v)
дает другой результатnumber($v) = $v
? Несомненно, это вытекает из того, что вы написали, но я не понимаю, где вы конкретно ответили на этот вопрос. Извините, если я веду себя глупо. IOW, всегда ли ваше решение и решение @Oded / @ Alejandro дают одинаковые результаты?В XPath 2.0 есть замечательный оператор проверки типов, который вы можете использовать:
<xsl:if test="$number castable as xs:double"> <!-- implementation --> </xsl:if>
источник
Я не пытаюсь предложить еще одно альтернативное решение, а пытаюсь предложить "мета-взгляд" на эту проблему.
Ответы, уже предоставленные Одедом и Димитром Новачевыми, верны, но то, что люди действительно могут иметь в виду под фразой «значение - это число», как я бы сказал, открыто для интерпретации.
В некотором смысле все сводится к этому странно звучащему вопросу: «как вы хотите выразить свои числовые значения?»
Функция XPath
number()
обрабатывает числа,Обратите внимание, что это не включает выражения для числовых значений, которые
Это не просто выдуманные критерии. Элемент с содержимым, которое согласно схеме является допустимым
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>
источник
Вы всегда можете использовать что-то вроде этого:
castable задокументирован W3C здесь .
источник
Я имел дело с 01 - числовым.
string(number($v)) != string($v)
делает сегрегациюисточник