使用xmlstarlet查询data-stream-collection的命名空间及URI问题
问题解答
这不是XPath的bug
这是XPath 1.0的正常行为:XPath 1.0不会自动继承或识别非根节点上声明的命名空间前缀,必须显式绑定前缀与对应的URI,才能直接使用带前缀的元素名进行查询。如果不绑定,只能通过local-name()匹配元素的本地名称。
查询元素的命名空间前缀与URI
可以通过xmlstarlet的sel命令结合XPath函数实现:
1. 提取命名空间URI和前缀
执行以下命令:
xmlstarlet sel -t -m "//*[local-name()='data-stream-collection']" -v "namespace-uri()" -n -v "substring-before(name(), ':')" example.xml
-m "//*[local-name()='data-stream-collection']":定位到目标元素-v "namespace-uri()":输出该元素的命名空间URI(即http://scap.nist.gov/schema/scap/source/1.2)-n:换行分隔结果-v "substring-before(name(), ':')":从元素的完整名称(带前缀)中提取前缀ds
2. 显式绑定命名空间后直接查询元素
如果后续需要直接用前缀查询该元素,可以用-N参数绑定命名空间:
xmlstarlet sel -N ds="http://scap.nist.gov/schema/scap/source/1.2" -t -m "//ds:data-stream-collection" -v "." example.xml
这样就能直接通过ds:data-stream-collection定位元素,无需依赖local-name()。
关于之前尝试失败的说明
你之前用namespace-uri()和Axes未成功,大概率是因为没有准确定位到目标元素,或者在未绑定命名空间的情况下直接使用带前缀的元素名进行查询,导致XPath无法识别该前缀对应的命名空间。
内容的提问来源于stack exchange,提问作者thomas
相关产品推荐
相关产品推荐

