首页 > 解决方案 > 使用“管道”字符的 XPath“或”运算符?

问题描述

在 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节点。

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

标签: xmlxpathoperatorsmsxml6

解决方案


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


推荐阅读