Как с помощью XPath проверить, является ли значение узла числом?
Любые идеи?
Как с помощью 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>
Required item type of first operand of '=' is numeric; supplied value has item type xs:string;
), однако решение Dimitre работает нормально.
Самый короткий способ проверить, можно ли использовать значение, содержащееся в переменной $v
, в качестве числа :
number($v) = number($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 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>
NaN
значение числового типа данных не равно никакому числовому значению, и для сравнения, если хотя бы один аргумент представляет собойnumber(MyNode)=MyNode