XPath тест, если значение узла-номер


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

какие идеи?

6 75

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 здесь.