Нахождение действительных и десятичных чисел - PullRequest
2 голосов
/ 30 марта 2011

Я использую xslt1.0 для конвертации html в xml.

<xsl:variable name="margin">0</xsl:variable>

<xsl:if test="number($margin)">
<xsl:message>Its number</xsl:message>
</xsl:if>

Это мой шаблон, который удовлетворяет условию и отображает сообщение. Если значение переменной margin равно 0,5, то условие становится ложным.

Как записать условие, которое соответствует десятичным дробям?

Ответы [ 2 ]

2 голосов
/ 30 марта 2011
     <xsl:template match="/">
      <xsl:variable name="margin">0</xsl:variable>

      <xsl:if test="number($margin)">
       <xsl:message>Its number</xsl:message>
      </xsl:if> </xsl:template>

This is my template which satisfying the condition and displaying message.
If the variable margin's value is 0.5, then the condition becomes false.

Это просто неправда. Протестированный с помощью 9 различных процессоров xslt (XSLT 1.0 и 2.0), приведенный выше код не выдает никаких сообщений. С другой стороны, любое числовое значение, отличное от 0, создает сообщение.

Объяснение

Из-за того, что number(0) равно 0, а boolean(0) равно false(), проверка не удалась.

Решение

Используйте это выражение XPath:

number($x) = number($x)

Это выражение оценивается как true() точно, когда $x является числом, а затем оно эквивалентно:

$x = $x

Если $x не является числом, приведенное выше выражение XPath оценивается как false(), поскольку оно эквивалентно:

NaN = NaN

и по определению NaN не равно никакому другому значению, включая NaN.

0 голосов
/ 30 марта 2011

Я попробовал ваш код (используя MSXSL.EXE, для которого требуется увидеть в сообщении terminate = "yes"), и обнаружил, как и ожидалось, обратное. Когда $ margin равно нулю, «если» не происходит, но если оно не равно нулю (например, 0,5), выполняется «если». Это связано с тем, что тестовое выражение оценивается с использованием той же семантики, что и функция «boolean ()», которая интерпретирует нулевое числовое значение как ложное, а любое ненулевое числовое значение - как истинное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...