鉴于
<catalogue>
<produits>
<produit id="pdt1" libelle="produit 1" cat="PDT">
<metas date="2015.07.24">
<meta code="123456" value="123456">
<meta code="789012" value="ghijkl">
<meta code="345678" value="mnopqr">
</metas>
</produit>
<produit id="pdt2" libelle="produit 2" cat="PDT">
<metas date="2015.07.24">
<meta code="123456" value="abcdef">
<meta code="789012" value="ghijkl">
<meta code="345678" value="mnopqr">
</metas>
</produit>
<produit id="pdt3" libelle="produit 3" cat="PDT">
<metas date="2015.07.24">
<meta code="123456" value="123456">
<meta code="789012" value="ghijkl">
<meta code="345678" value="mnopqr">
</metas>
</produit>
</produits>
</catalogue>
<catalogue>
<produits>
<produit id="pdt1" libelle="produit 1" cat="PDT">
<metas date="2015.07.24">
<meta code="123456" value="123456">
<meta code="789012" value="ghijkl">
<meta code="345678" value="mnopqr">
</metas>
</produit>
<produit id="pdt2" libelle="produit 2" cat="PDT">
<metas date="2015.07.24">
<meta code="123456" value="abcdef">
<meta code="789012" value="ghijkl">
<meta code="345678" value="mnopqr">
</metas>
</produit>
<produit id="pdt3" libelle="produit 3" cat="PDT">
<metas date="2015.07.24">
<meta code="123456" value="123456">
<meta code="789012" value="ghijkl">
<meta code="345678" value="mnopqr">
</metas>
</produit>
</produits>
</catalogue>
必填:如果其子节点元包含123456,则查找id的值。
我的尝试:
我可以使用//meta[@* = "123456"]
访问元素我需要选择祖先ID。
来源: http://practicalsqa.net/beginning-brainteaser-querying-subchildren/
更新 感谢@CiaPan纠正上述XML中的2个错误,正确的是:
<data>
<catalogue>
<produits>
<produit id="pdt1" libelle="produit 1" cat="PDT">
<metas date="2015.07.24">
<meta code="123456" value="123456" />
<meta code="789012" value="ghijkl" />
<meta code="345678" value="mnopqr" />
</metas>
</produit>
<produit id="pdt2" libelle="produit 2" cat="PDT">
<metas date="2015.07.24">
<meta code="123456" value="abcdef" />
<meta code="789012" value="ghijkl" />
<meta code="345678" value="mnopqr" />
</metas>
</produit>
<produit id="pdt3" libelle="produit 3" cat="PDT">
<metas date="2015.07.24">
<meta code="123456" value="123456" />
<meta code="789012" value="ghijkl" />
<meta code="345678" value="mnopqr" />
</metas>
</produit>
</produits>
</catalogue>
<catalogue>
<produits>
<produit id="pdt1" libelle="produit 1" cat="PDT">
<metas date="2015.07.24">
<meta code="123456" value="123456" />
<meta code="789012" value="ghijkl" />
<meta code="345678" value="mnopqr" />
</metas>
</produit>
<produit id="pdt2" libelle="produit 2" cat="PDT">
<metas date="2015.07.24">
<meta code="123456" value="abcdef" />
<meta code="789012" value="ghijkl" />
<meta code="345678" value="mnopqr" />
</metas>
</produit>
<produit id="pdt3" libelle="produit 3" cat="PDT">
<metas date="2015.07.24">
<meta code="123456" value="123456" />
<meta code="789012" value="ghijkl" />
<meta code="345678" value="mnopqr" />
</metas>
</produit>
</produits>
</catalogue>
</data>
答案 0 :(得分:1)
找到所有合适的meta
元素,然后寻找他们的祖先。
如果您对指定的两个属性中的给定值感兴趣:
/descendant::meta[ (@code, @value)="123456"]/ancestor::*/@id
如果可以在meta
元素的任何属性中找到该值:
distinct-nodes( /descendant::meta[ @* = "123456"]/ancestor::*)/@id
您也可以采用其他方式:使用id
属性扫描所有元素,测试其meta
后代元素并返回符合这些会议条件的id
属性:
/descendant::*[ @id and descendant::meta[ @* = "123456"]]/@id
答案 1 :(得分:1)
为了不使用复杂的Xpath Axises,您可以通过以下逻辑选择具有特定子项的项目:
item[.//someShild]
所以需要xpath是:
//produit[.//meta[@value=123456]]/@id
或者您可以按//produit[.//meta[@value=123456]]
选择具有特定元的所有项目,并使用其他工具获取ID