Запрос и выбор веток с помощью xpath - PullRequest
0 голосов
/ 19 декабря 2018

Я хочу получить XML-документ, содержащий NAME, FIRSTNAME и STR всех записей, где ZIP = 2222 и NAME = Meier.

Ввод:

<ROOT> 
<REC>
  <CONTACT>
    <NAME>Schmidt</NAME>
    <FIRSTNAME>Hans</FIRSTNAME>
  </CONTACT>
  <CONTACT>
    <NAME>Schmidt</NAME>
    <FIRSTNAME>Kurt</FIRSTNAME>
  </CONTACT>
  <LOC>
    <ZIP>1111</ZIP>
    <STR>Mainroud</STR>
  </LOC>
</REC>
<REC>
  <CONTACT>
    <NAME>Meier</NAME>
    <FIRSTNAME>Elise</FIRSTNAME>
  </CONTACT>
  <LOC>
    <ZIP>2222</ZIP>
    <STR>Castlestreet</STR>
  </LOC>
</REC>
</ROOT>

Требуетсявывод:

 <OUT>
    <NAME>Meier</NAME>
    <FIRSTNAME>Elise</FIRSTNAME>
    <STR>Castlestreet</STR>
 </OUT>

Я пытался:

/ROOT/REC[.//ZIP="2222" and .//NAME/text()="Meier"]

, который возвращает соответствующие элементы REC, но как я могу отформатировать вывод.Я хотел бы использовать только Xpath, а не Xquery, если это возможно?

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

Лучшее, что вы можете сделать, это указать, какие узлы вы хотите иметь в своем выводе, но они не будут включены в узел <OUT>, потому что в исходном XML его нет.Если вам нужен список определенных узлов, вам придется изменить свой XPath на что-то вроде этого:

/ROOT/REC[.//ZIP="2222" and .//NAME/text()="Meier"]//(NAME|ZIP|STR)

, что даст вам следующий результат:

<NAME>Meier</NAME>
<ZIP>2222</ZIP>
<STR>Castlestreet</STR>

Результатколлекция узлов, а не один узел с дочерними узлами, вам придется перебирать коллекцию.Не совсем то, что вы просили, но закрывает то, что я мог придумать, используя только XPath.

0 голосов
/ 28 декабря 2018

Другое хорошее решение:

//REC[.//ZIP="2222" and .//NAME/text()="Meier"]
!<OUT>
  {.//NAME}
  {.//STR}
  {.//ZIP}
</OUT>
0 голосов
/ 19 декабря 2018

Вы можете использовать ниже код:

      let $input :=doc("input.xml")/ROOT/REC[.//ZIP="2222" and 
     .//NAME/text()="Meier"]
     return <OUT>{($input//NAME, $input//FIRSTNAME,  $input//STR)}</OUT>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...