在 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 中是否有解决方案,或者是否有我可以实现的替代解析器?
最佳答案
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 之前也发布了此内容。)
关于xml - XPath 'or' 运算符使用 'pipe' 字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65544668/