#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
]
вывод :
<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 и т. Д.).