【问题标题】:Check If Set of Nodes are Equal to Each Other XPath 1.0检查节点集是否彼此相等 XPath 1.0
【发布时间】:2016-04-26 17:26:13
【问题描述】:

我想使用 XPath 选择几个以相同单词结尾的节点并检查它们是否彼此相等。所以,例如,

<a>
    <b-token>123456789</b-token>
    ...
    <c>
        <d>
            <d-token>123456789</d-token>
            ...
        </d>
        <e>
            <e-token>123456789</e-token>
            ...
        </e>
        <f>
            <f-token>123456789</f-token>
            ...
        </f>
    <c>
</a>

所以,我想搜索所有以“-token”结尾的节点并确保它们是等价的。这可以在 XPath 1.0 中完成吗? 2.0? XSD?

这是一个我虽然可以工作的示例 XPath,但它没有

String xpathExpression = "/descendant-or-self::node()/*[substring(name(), string-length(name() ) - (string-length('token')-1) ) = 'token'] = /descendant-or-self::node()/*[substring(name(), string-length(name() ) - (string-length('token')-1) ) = 'token']";

当我像这样在 '=' 之后放置一个特定值时,它会起作用:

String xpathExpression = "/descendant-or-self::node()/*[substring(name(), string-length(name() ) - (string-length('token')-1) ) = 'token'] = '123456789'";

如果重要的话,我正在使用 Java 7。

谢谢

【问题讨论】:

    标签: xml xpath compare equals nodelist


    【解决方案1】:

    如果您使用not(//*[substring(local-name(), string-length(local-name()) - 5) = '-token'] != //*[substring(local-name(), string-length(local-name()) - 5) = '-token']),那么只要所有这些元素具有相同的字符串值,则该比较结果为真,如果至少有一个元素的字符串内容不相等,则该比较结果为假。

    【讨论】:

    • 在我看来这行得通;但是,我没有遵循原因。看来您只是做了与我所做的相反的操作,即比较两组节点是否为!=,然后通过将所有内容包装在not() 中来取与该布尔值相反的值。对我来说,它们在逻辑上是相同的,但显然它们不是。
    • 使用 XPath,如果$node-set1 中的至少一项不等于(至少)$node-set2 中的一项,则比较 $node-set1 != $node-set2 为真。通过否定not($node-set1 != $node-set2),我们确保所有项目都是平等的。请参阅w3.org/TR/xpath/#booleans,它说“如果要比较的两个对象都是节点集,那么当且仅当第一个节点集中有一个节点并且第二个节点集中有一个节点时,比较才会为真,使得对两个节点的字符串值进行比较的结果为真。”。
    • 好的,感谢您的详尽解释!我会投票,但我现在是一个卑微的苦工。
    • 只要第一个节点集中的一个项目等于第二个节点集中的一个项目,您对= 的尝试就为真。
    猜你喜欢
    • 2011-09-08
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    相关资源
    最近更新 更多