我正在尝试使用 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(使用前将#替换为@)