Операторы равенства и неравенства 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'