提问人:DaveF 提问时间:1/3/2021 最后编辑:kjhughesDaveF 更新时间:1/3/2021 访问量:1919
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
在撒克逊语中使用它时,此语法有效。MSXML中是否有解决方案,或者是否有我可以实现的替代分析器?
答:
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
*
此处匹配任何元素。
评论