XPath:选择具有带有属性的子节点的父节点

XPath:选择具有带有属性的子节点的父节点,xpath,Xpath,我想得到“Package”节点,它有一个带有“mtm”属性的“System”孙子节点,“mtm”属性的值是“2055”。对于下面的示例文档,只应返回第一个包节点 我用 "/Database/Package[/SystemCompatibility/System[@mtm='2055']]" 但它不起作用。这个表达有什么不对 <?xml version="1.0" encoding="UTF-8"?> <Database version="300"> <Packag

我想得到“Package”节点,它有一个带有“mtm”属性的“System”孙子节点,“mtm”属性的值是“2055”。对于下面的示例文档,只应返回第一个包节点

我用

"/Database/Package[/SystemCompatibility/System[@mtm='2055']]"
但它不起作用。这个表达有什么不对

<?xml version="1.0" encoding="UTF-8"?>
<Database version="300">
<Package id="6imb05ww" description="ThinkPad Modem Adapter">  
    <SystemCompatibility>
        <System mtm="8742" os="Windows XP" oslang="en" />
        <System mtm="2055" os="Windows XP" oslang="jp" />
    </SystemCompatibility>
</Package>
<Package id="6imb06ww" description="ThinkPad Modem Adapter">  
    <SystemCompatibility>
        <System mtm="3046" os="Windows XP" oslang="en" />
    </SystemCompatibility>
</Package>
</Database>

尝试使用:

/Database/Package/descendant::System[@mtm='2055']
使用后代::操作符将允许您获取包的任何系统孙子。
系统兼容性之前删除
/

/Database/Package[SystemCompatibility/System[@mtm='2055']]

这将只返回系统节点,而不是整个包nodeAh,您是对的。我误解了这个问题。谢谢你指出这一点。这将与一些修改工作!注意封装括号
/Database/Package[genderant::System[@mtm='2055']]
我刚刚测试了确切的代码,以确保它能正常工作,但你在发布它时击败了我。谢谢你也发布了更正!很有效,谢谢。糟糕的是,我本以为我已经尝试过这种方法,但实际上我没有。