Узел запроса XPath на основе другого атрибута узла

#xml #xpath

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

Мне нужно получить фамилию, дату рождения, рост, количество и очки каждого игрока в 1-й команде (/ TEAM [1]), где начало = «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"/>
  

для 2-й КОМАНДЫ (/TEAM[2])

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

Заранее спасибо за вашу помощь

Ответ №1:

Я не думаю, что это можно сделать, используя одно выражение 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. Благородная попытка, но на самом деле невозможно выполнить запрос OP только с помощью XPath, учитывая, что не PLAYER существует элемента с запрошенным @Points атрибутом и другими запрошенными атрибутами одновременно.

Ответ №2:

XPath предназначен для выбора, а не для преобразования. (XSLT предназначен для преобразования.)

Вы можете выбирать только среди PLAYER элементов, которые существуют во входном документе. Поскольку PLAYER во входном XML-файле нет элементов с @Points атрибутами и другими атрибутами ( @Birth_date etc), ваш запрос, включая,

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

невозможно выполнить только с помощью XPath. Вам понадобится помощь от языка хостинга (XSLT, Python, Java и т. Д.).