XPath查询节点基于另一个节点属性

时间:2016-10-01 19:48:06

标签: xml xpath

我有以下XML

<NETCASTING>
    <MATCHINFO>
        <TEAM Name="TEAM A" >
            <PLAYER Birth_date="1987.04.20" Height="1.98" Surname="Robinson" Number="4"/>
            <PLAYER Birth_date="1988.07.11" Height="1.84" Surname="Zhedik" Number="7"/>
            <PLAYER Birth_date="1986.01.27" Height="1.86" Surname="Kirillova" Number="9"/>
        </TEAM>
        <TEAM Name="TEAM B" >
            <PLAYER Birth_date="1986.12.28" Height="1.97" Surname="Lyttle" Number="2"/>
            <PLAYER Birth_date="1989.09.18" Height="1.94" Surname="Arteshina" Number="4"/>
            <PLAYER Birth_date="1987.05.11" Height="1.96" Surname="Belyakova" Number="5"/>
            <PLAYER Birth_date="1989.03.13" Height="1.99" Surname="Baric" Number="9"/>
        </TEAM>
    </MATCHINFO>
    <BOXSCORE>
        <TEAM>
            <PLAYER Number="4" Start="1" Points="11"/>
            <PLAYER Number="7" Start="0" Points="3"/>
            <PLAYER Number="9" Start="1" Points="0"/>
        </TEAM>
        <TEAM>
            <PLAYER Number="2" Start="0" Points="14"/>
            <PLAYER Number="4" Start="0" Points="2"/>
            <PLAYER Number="5" Start="1" Points="2"/>
            <PLAYER Number="9" Start="0" Points="0"/>
        </TEAM>
    </BOXSCORE>
</NETCASTING>

我需要得到Surname,Birth_date,Height,Number&amp;第一队(/ TEAM [1])中每个队员的得分,其中Start =“1”

所以我需要得到:

<PLAYER Birth_date="1987.04.20" Height="1.98" Surname="Robinson" Number="4" Points="11"/>
<PLAYER Birth_date="1986.01.27" Height="1.86" Surname="Kirillova" Number="9" Points="0"/>

of 2nd TEAM(/ TEAM [2])

<PLAYER Birth_date="1987.05.11" Height="1.96" Surname="Belyakova" Number="5" Points="2"/>

提前感谢您的帮助

2 个答案:

答案 0 :(得分:2)

我不认为可以使用单个XPath表达式完成此操作。假设匹配信息总是由2个对立的团队组成,那么您可以使用2个XPath查询,每个团队一个,并使用union(|)运算符加入结果:

/NETCASTING/MATCHINFO/TEAM[1]/PLAYER[
    @Number = /NETCASTING/BOXSCORE/TEAM[1]/PLAYER[@Start=1]/@Number
] |
/NETCASTING/MATCHINFO/TEAM[2]/PLAYER[
    @Number = /NETCASTING/BOXSCORE/TEAM[2]/PLAYER[@Start=1]/@Number
]

<强> demo

输出

<PLAYER Birth_date="1987.04.20"
        Height="1.98"
        Surname="Robinson"
        Number="4"/>
<PLAYER Birth_date="1986.01.27"
        Height="1.86"
        Surname="Kirillova"
        Number="9"/>
<PLAYER Birth_date="1987.05.11"
        Height="1.96"
        Surname="Belyakova"
        Number="5"/>

答案 1 :(得分:1)

XPath用于选择,而不是用于转换。 (XSLT用于转换。)

您只能在输入文档中存在的PLAYER元素中进行选择。由于输入XML中没有PLAYER元素,其中@Points属性为 ,其他属性(@Birth_date等),您的请求,包括,

<PLAYER Birth_date="1987.04.20" 
        Height="1.98" 
        Surname="Robinson" 
        Number="4"
        Points="11"/>  <!-- Cannot add Points attribute -->

单独使用XPath是不可能的。您需要托管语言(XSLT,Python,Java等)的帮助。