Операторы равенства и неравенства XSLT возвращают одинаковый результат для отсутствующего узла. Как это возможно?

XML:

<root></root>

XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" indent="yes" encoding="UTF-8"/>
    <xsl:template match="/root">
        absent_node EQUALS zero-length string [<xsl:value-of select="absent_node=''"/>];
        absent_node NOT EQUALS zero-length string via != [<xsl:value-of select="absent_node!=''"/>]
    </xsl:template>
</xsl:stylesheet>

Результат:

absent_node EQUALS zero-length string [false];
absent_node NOT EQUALS zero-length string [false]

Я видел аналогичную проблему с Python, но здесь нужно пояснение.

Является ли использование not() предпочтительным, если я хочу получить только противоположный результат без явного приведения типа значения через text() или string()?

1 ответ

Решение

Это ожидаемый результат в этом типе сравнения.

Вы сравниваете набор узлов со строкой. Правила такого сравнения гласят:

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

Это правило определяется единообразно для всех операторов сравнения (=, !=, <=, <, >= and >).

Поскольку ваш набор узлов пуст, в нем никогда не будет узла, для которого сравнение возвращает true - независимо от того, какой оператор вы используете.


Принято использовать:

not(node = 'string')

как отрицание:

node = 'string'
Другие вопросы по тегам