使用 "OR" 运算符的 XMLPath 查询

XMLPath Query with "OR" Operator

我得到一个 .xml 文件,其中包含以下条目:

<country>
<province id="prov-cid-cia-Greece-3" country="GR">
    <name>Attiki</name>
    <area>3808</area>
    <population>3522769</population>
    <city id="cty-Greece-Athens" is_country_cap="yes" country="GR" province="prov-cid-cia-Greece-3">
        <name>Athens</name>
        <longitude>23.7167</longitude>
        <latitude>37.9667</latitude>
        <population year="81">885737</population>
        <located_at watertype="sea" sea="sea-Mittelmeer"/>
     </city>
</province>
</country>

然而,也有一些节点被称为 city 而没有 province 作为 parent:

<country>
    <city id="stadt-Shkoder-AL-AL" country="AL">
        <name>Shkoder</name>
        <longitude>19.2</longitude>
        <latitude>42.2</latitude>
        <population year="87">62000</population>
        <located_at watertype="lake" lake="lake-Skutarisee"/>
    </city>
</country>

无需进一步解释,我想 select 所有节点 city,但是,在我当前的查询中它 select 仅 cities 没有 province作为 parent

query = f"//country/city[@is_country_cap = \"yes\" and ./located_at[@watertype]]/name/text()"

如何在我的查询中包含 /province/country?我试过:

query = f"//country/(city | ./province/city)[@is_country_cap = \"yes\" and ./located_at[@watertype]]/name/text()"

没有任何成功,我得到一个错误。

您可以匹配具有 <country><province> 父级的所有 <city> 元素。然后,在第二个谓词中,像这样添加您的其他要求:

//city[parent::country or parent::province][@is_country_cap = 'yes' and located_at[@watertype]]/name

或者,接近你的语言

query = f"//city[parent::country or parent::province][@is_country_cap = \"yes\" and located_at[@watertype]]/name/text()"

也许这对你有帮助。
您的错误是使用 | 运算符而不是关键字 or。在 XPath 中,| 运算符表示“合并节点集”,而不是像 C 中那样的逻辑“或”。