XPath选择某个孩子的祖先属性

时间:2017-10-17 12:25:22

标签: xpath

鉴于

<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>

2 个答案:

答案 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