xmllint 选择一个节点,即使 contains() 不应该匹配

xmllint selects a node even though contains() should not match

我有这个 CML 输入:

<prova>
    <parent>
        <groupId>error</groupId>
    </parent>
    <groupId>ok</groupId>
</prova>

和这个 XPath:

xmllint --xpath '/prova/parent/groupId/text()[contains(.,'ok')]'

它不应该匹配任何东西,但它匹配 error。为什么?

不要使用嵌套单引号:

xmllint --xpath '/prova/parent/groupId/text()[contains(.,"ok")]' test.xml

结果

XPath set is empty

解释:

shell 将 '/prova/parent/groupId/text()[contains(.,'ok')]' 视为

/prova/parent/groupId/text()[contains(.,ok)]

在此 XPath 中,ok 被解释为元素名称。元素 <ok> 不存在,因此选择一个空节点集。

为了contains(),空节点集被转换为空字符串。并且任何字符串都包含空字符串,因此条件始终为真。