xpath 是否明确允许未定义的变量?

Does xpath explicitly allow undefined variables?

提问人:android.weasel 提问时间:5/7/2023 最后编辑:Gilles Quénotandroid.weasel 更新时间:5/7/2023 访问量:40

问:

我试图使用xmlstarlet从XML文件中提取一些数据,但是

xmlstarlet sel -t  -v '//div[contains(@class,'addresses')]/a'

给我的比我预期的要多得多。

我终于弄清楚了 - 在替换 with 的帮助下调试 xpath - 这是因为周围的单引号消失了,因为整个参数都是单引号:替换为 按预期工作。-v-c'addresses'"addresses"

我真正感到困惑的是它做了什么 - 因为 xmlstarlet 没有将其标记为错误或警告它,即使我认为它被视为未定义的变量。contains(@class,addresses)

我在 https://github.com/fishjam/xmlstarlet/blob/master/src/xml_select.c 中检查了源代码,但我找不到“警告”标志 - 应该有这样的东西,还是定义了 xpaths 以允许这样做?

xpath xml-解析 xmlstarlet

评论


答:

2赞 Martin Honnen 5/7/2023 #1

在 中,选择以上下文节点命名的(可能的)子元素(即在谓词所属的元素中);变量(引用)将写成 。contains(@class,addresses)addressesaddresses//div[contains(@class,addresses)]div[contains(@class,addresses)]$addresses

评论

0赞 android.weasel 5/8/2023
感谢您的回复...但是我的 S 没有任何元素,那么为什么会选择任何 S?我有点困惑,这意味着“如果类属性包含单词”,但不引用它意味着什么......奇怪。div<address>divcontains(@class,"address")address
0赞 Martin Honnen 5/8/2023
您的问题只是说您预计会出现未声明变量的错误或警告;没有迹象表明你选择了你没想到会被选中的东西;我认为这是一个边缘情况,其中 contains 的定义说对于空字符串作为第二个参数,结果是真的;和一个空的节点集(例如 has 作为第二个参数)转换为空字符串。contains(@class, addresses)