XPath 'or' 运算符使用“pipe”字符?

XPath 'or' operator using the 'pipe' character?

提问人:DaveF 提问时间:1/3/2021 最后编辑:kjhughesDaveF 更新时间:1/3/2021 访问量:1919

问:

在 AutoHotKey 例程中,我使用 MSXML6 来分析 XML 文档。

doc := ComObjCreate("MSXML2.DOMDocument.6.0")
doc.setProperty("SelectionLanguage", "XPath")
doc.async := false
doc.loadXML(xmldata)
doc.selectNodes("osm/way|rel[tag[@k='railway'][@v='station']]").length

在该行中,我希望仅将结果过滤到两个节点:SelectNodesway|rel

它不会引发错误,但会忽略仅返回节点。relway

在撒克逊语中使用它时,此语法有效。MSXML中是否有解决方案,或者是否有我可以实现的替代分析器?

XML XPath 运算符 msxml6

评论


答:

1赞 wp78de 1/3/2021 #1

由于您使用的是 MSXML (v6),因此您仅限于 XML 1.0 的功能(由 W3C 从 v4 开始定义)。这意味着您不能在轴步长 (ref) 上使用交替。因此,您需要拆分路径:

doc.selectNodes("osm/way[tag[@k='railway'][@v='station']] | osm/rel[tag[@k='railway'][@v='station']]")

我已经通过 COM 使用 MSXML6 在 PowerShell 中对此进行了端到端测试,并且它按预期工作。

评论

0赞 kjhughes 1/3/2021
有效 (+1),但可以简化
3赞 kjhughes 1/3/2021 #2

XPath 2.0 需要像这样在单个 XPath 中使用。MSXML 仅支持 XPath 1.0。|

XPath 1.0 版本

@wp78de的答案有效 (+1),但您可以通过使用谓词中的轴来避免复制条件:tag[@k='railway'][@v='station']|self::

osm/*[(self::way or self::rel) and tag[@k='railway'][@v='station']]

XPath 2.0 版本

为了以后可能使用 XPath 2.0 库的读者的利益:

osm/(way|rel)[tag[@k='railway' and @v='station']]

(@wp78de在意识到 OP 仅限于 XPath 1.0 之前也发布了这个。

评论

0赞 DaveF 1/4/2021
谢谢。在这种情况下,您能否澄清一下星号(大概意味着“所有”)的用途?
0赞 kjhughes 1/4/2021
*此处匹配任何元素。