You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 10:25:17