XPath - 属性通配符不返回具有名为 value 的属性的元素

2024-02-10

我正在尝试使用 XPath (Java) 来获取基于以特定值开头的未知属性的所有未知节点。由于某种原因,它没有返回包含名为的属性的节点value。我也测试过www.freeformatter.com/xpath-tester.html http://www.freeformatter.com/xpath-tester.html并得到相同的结果。这是我所拥有的:

XML:

<div>
    <object data="/v1/assets/mp4Video-1" type="video/mp4">
        <param name="webmSource" value="/v1/assets/webmVideo-1" type="REF"/>
    </object>
</div>

XPath 表达式:

//*[starts-with(@*, '/v1/assets/')]

结果 -返回<object>,但不是<param>.

现在,如果我将 XPath 表达式更改为//*[starts-with(@*, '/v1/assets/') or starts-with(@value, '/v1/assets/')],它会按预期返回两者。

我想我的问题是,这是关于什么的value属性,导致 XPath 无法正确地将其识别为属性,或者在value属性包含我正在查询的值?


你原来的路径表达式的原因:

//*[starts-with(@*, '/v1/assets/')]

不起作用与 XPath 1.0 中的函数如何处理比预期更多的节点有关。这starts-with()函数期望单个节点作为其第一个参数,字符串(或计算结果为字符串的节点)作为其第二个参数。

但在上面的表达式中,starts-with()被交给set属性节点,@*,作为它的第一个参数。在这种情况下,只有first该函数使用这些属性节点。该集中的所有其他节点都将被忽略。由于 XML 中没有定义属性的顺序,因此 XPath 引擎可以自由选择要在函数中使用的任何属性节点。但是您的特定 XPath 引擎(以及许多其他引擎)似乎始终使用first属性节点,按照其出现的顺序。

为了说明这一点(并证明这一点),请将您的输入文档更改为

<div>
    <object data="other" type="/v1/assets/mp4Video-1">
        <param name="/v1/assets/webmVideo-1" value="other" type="REF"/>
    </object>
</div>

如您所见,我更改了属性的顺序,并且属性包含/v1/assets/现在是second的属性object元素,反之亦然param元素。使用此输入文档,您的原始 XPath 表达式将仅返回param元素。

同样,这种行为在不同的 XPath 引擎之间不一定一致!使用 XPath 的其他实现可能会产生不同的结果。


满足您需要的 XPath 表达式是

//*[@*[starts-with(., '/v1/assets/')]]

用简单的英语来说,它说

选择文档中任意位置的元素,但前提是该元素的所有属性节点中存在一个值以“/v1/assets/”开头的属性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XPath - 属性通配符不返回具有名为 value 的属性的元素 的相关文章

随机推荐