【问题标题】:XSLT equal and not equal operators returns same result for absent node. How is it possible?XSLT 相等和不相等运算符为缺席节点返回相同的结果。这怎么可能?
【发布时间】:2017-08-17 10:27:24
【问题描述】:

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]

我看到了similar issue with python,但这里需要解释一下。

如果我想在不通过 text() 或 string() 进行显式值类型转换的情况下获得正好相反的结果,是否首选使用 not()?

【问题讨论】:

    标签: xml xslt saxon


    【解决方案1】:

    这是此类比较的预期结果。

    您正在将节点集与字符串进行比较。用于此类比较的 rules 表明:

    当且仅当在 节点集,使得对 节点的字符串值,其他字符串为真。

    此规则是为所有比较运算符统一定义的 (=, !=, &lt;=, &lt;, &gt;= and &gt;)。

    由于您的节点集是空的,因此无论您使用哪个运算符,其中都不会有比较返回 true 的节点。


    习惯使用:

    not(node = 'string')
    

    否定:

    node = 'string'
    

    【讨论】:

    • 引用来自 XPath 1.0 规范,但 2.0 的规则基本相同,但可以推广到任意序列。当 X 为空序列时, (X = 'a') 表示“X 中有一个项目等于 'a'”,而 (X != 'a') 表示“X 中有一个项目等于不等于‘a’”;如果 X 是一个空序列,这两个条件都是假的。
    • 顺便提一下,如果您在 SQL 中将不存在的元素/属性视为 null,则语义与 SQL 语义非常相似:X='a' 和 X!='a'当用于谓词时,两者都会导致 X 未被选中。不同之处在于,在 SQL 中,谓词有效地计算为 null,而在 XPath 中,它的计算结果为 false。
    最近更新 更多