让XQuery像SQL这样的AS语句更改返回元素名称,例如工会的

时间:2018-12-26 08:45:59

标签: xpath xquery

我有两个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串联的Name。

<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

我知道我可以使用逗号分隔的xpath创建一个联合:

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

但是我无法像SQL中的AS语句一样更改返回的元素名称。

2 个答案:

答案 0 :(得分:2)

您需要构造新元素,对于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>

答案 1 :(得分:1)

根据Martin Honnen的输入,解决方案是:

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