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

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

在 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

SelectNodes 行中,我希望将结果过滤为仅两个节点:way|rel

它不会抛出错误但会忽略 rel 仅返回 way 个节点。

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

由于您使用的是 MSXML (v6),因此您只能使用 XML 1.0 (as defined by the W3C as of v4). This means you are not allowed to use alternations on an axis step (ref) 的功能。因此,你需要拆分你的路径:

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

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

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

XPath 1.0

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

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 之前也发布了这个。)