Имеет XQuery оператор AS, такой как SQL, для изменения имени возвращаемого элемента, например, объединения - PullRequest
0 голосов
/ 26 декабря 2018

У меня есть два XML-документа, и я хочу создать объединение.Два документа имеют разные форматы.

Doc1:

<contact>
  <realName>Kurt Meier</realName>
  <phone number="017289232"></phone>
</contact>

Doc2:

<Person>
  <Name>Susie</Name>
  <FirstName>Meier</FirstName>
  <Phone>0173895734</Phone>
</Person>

Требуемый вывод должен быть нормализован.Где FULLNAME - это realName в случае элемента, а FULLNAME - это имя, объединенное с FirstName в случае элемента.

<CONTACT>
  <FULLNAME>Kurt Meier</FULLNAME>
  <PHONE_NO>017289232<PHONE_NO> 
</CONTACT>
<CONTACT>
  <FULLNAME>Susie Meier</FULLNAME>
  <PHONE_NO>0173895734<PHONE_NO> 
</CONTACT>

В sql это будет выглядеть так:

select 
   realName               as FULLNAME,
   number                 as PHONE_NO
from  Doc1
union all
select 
   FirstName ||' '|| Name as FULLNAME,
   phone                  as PHONE_NO
from  Doc2

Я знаючто я могу создать объединение, используя разделенные запятыми xpaths:

 for $e in (doc("Doc1.xml")//contact, doc("Doc2.xml")//Person)
 return $e

, но мне не удается изменить имена возвращаемых элементов, как с помощью оператора AS в SQL.

Ответы [ 2 ]

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

Основываясь на мнении Мартина Хоннена, решение:

(
doc("Doc1")//contact
!<CONTACT>
  <FULLNAME>{data(realName)}</FULLNAME>
  <PHONE_NO>{data(phone/@number)}/</PHONE_NO>
</CONTACT>,
doc("Doc2")//Person
!<CONTACT>
  <FULLNAME>{data(Name)} {' '} {data(FirstName)}</FULLNAME>
  <PHONE_NO>{data(Phone)}/</PHONE_NO>
</CONTACT>

)

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

Вам необходимо создать новые элементы, в случае XQuery 3 самый компактный синтаксис -

doc("Doc1.xml")//contact!<CONTACT><FULLNAME>{realName}</FULLNAME><PHONE_NO>{phone/@number}/</PHONE_NO></CONTACT>,
doc("Doc2.xml")//Person!<CONTACT><FULLNAME>{Name} {FirstName}</FULLNAME><PHONE_NO>{Phone}/</PHONE_NO></CONTACT>
...