XPath加入两个元素

时间:2014-01-08 10:45:16

标签: xml xpath xquery

我正在努力解决XPath问题。在SQL术语中,我正在尝试连接两个列表,并使用另一个列表中的属性从一个列表中选择元素。

我的XML文档:

<DOSSIER>
    <PRODUCT_DEF>
        <NUMBER>1</NUMBER>
        <SHOW>true</SHOW>
    </PRODUCT_DEF>
    <PRODUCT_DEF>
        <NUMBER>2</NUMBER>
        <SHOW>false</SHOW>
    </PRODUCT_DEF>
    <CONTRACT>
        <NUMBER>11</NUMBER>
        <PRODUCT_DEF_NUMBER>1</PRODUCT_DEF_NUMBER>
    </CONTRACT>
    <CONTRACT>
        <NUMBER>22</NUMBER>
        <PRODUCT_DEF_NUMBER>2</PRODUCT_DEF_NUMBER>
    </CONTRACT>
    <CONTRACT>
        <NUMBER>33</NUMBER>
        <PRODUCT_DEF_NUMBER>2</PRODUCT_DEF_NUMBER>
    </CONTRACT>
    <CONTRACT>
        <NUMBER>44</NUMBER>
        <PRODUCT_DEF_NUMBER>1</PRODUCT_DEF_NUMBER>
    </CONTRACT>
</DOSSIER>

所以我试图选择相应PRODUCT_DEF / SHOW = true的所有CONTRACT元素。 CONTRACT_DEF / VOLGNUM与CONTRACT / PRODUCT_DEF_NUMBER

相关

在我的尝试中,我试图加入这两个元素,但我认为在CONTRACT元素中突然引用一个完全不同的元素是不可能的:

//CONTRACT[..//PRODUCT_DEF[NUMBER=./PRODUCT_DEF_NUMBER]/SHOW="true"]

结果应该是两个节点的列表,包含:

合同[NUMBER = 11],
合同[NUMBER = 44]

这甚至可能吗? 也许我应该分两步完成它?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

一般情况下,XPath使用//是一个错误(它会搜索所有元素,因此难以控制,也会变慢)。

  1. 基本选择为/DOSSIER/CONTRACT[condition],这意味着conditionCONTRACT元素作为上下文节点(这是.将引用的内容)。因此

  2. 要进入条件需要PRODUCT_DEF的{​​{1}}节点,但这意味着产品状态的任何子条件都将使用该./PRODUCT_DEF_NUMBER = ../PRODUCT_DEF/NUMBER子节点作为其上下文,但可以将条件应用于NUMBER节点。因此

  3. 期待您需要以下内容:

    PRODUCT_DEF
  4. 但是,我可能会更改为/DOSSIER/CONTRACT[./PRODUCT_DEF_NUMBER = ../PRODUCT_DEF[./SHOW = 'true']/NUMBER] 使用绝对路径以及删除不必要的PRODUCT_DEF,以便更容易看到正在发生的事情:

    ./

    PS。我讨厌所有的帽子,为什么有些人想要保留这些古代系统的人工制品?因此可能存在拼写错误。