我有一个要求,即在写入.csv文件时,我总是需要输出可选的XML元素(无论数据可用性如何)。
XML文件格式
<entries>
<countryCode>123</countryCode>
<adminDataMap>
<testAccount>True</testAccount>
<code>11</code>
</adminDataMap>
<privateMap>
<email>abc@abc.com</email>
<cancelReason>Not interested</cancelReason>
</privateMap>
</entries>
此处&#39;条目&#39;根元素 &#39; cancelReason&#39;,&#39; testAccount&#39;是可选元素,仅在数据出现时才可用。
即某些记录会包含那些可选的&#39;领域和其他人没有。
我编写了一个XQuery来提取所有这些元素
let $entries := /root/entries
return
for $entry in $entries
return
<entries>
{
$entry/*,
$entry/privateMap/email,
$entry/privateMap/cancelReason,
$entry/adminDataMap/code,
$entry/adminDataMap/testAccount
}
</entries>
我的要求是将所有必需元素和可选元素提取为OUTPUT。即输出元数据始终保持不变。如果是可选的&#39; cancelReason&#39;没有值,它将被填充为空白/空类[类似的东西]
请告知XQUERY中的任何选项,以便实现此目的。
答案 0 :(得分:0)
试试这个Xquery:
let $entries := $root/entries
for $entry in $entries
return <OUTPUT>
{<mandatory>{$entry//countryCode}
{<adminDataMap>{$entry//adminDataMap/code}</adminDataMap>}
{$entry//privateMap/email}</mandatory>}
{<optional>{<testAccount>{data($entry/adminDataMap/testAccount)}</testAccount>}
<cancelReason>{data($entry/privateMap/cancelReason)}</cancelReason></optional>
}</OUTPUT>
为每个条目分别提供强制和可选元素。
答案 1 :(得分:0)
试试这个XQuery:
for $entry in $entries
return
<entries>
{
for $admin in $entry/adminDataMap
return
<admin>
{$admin/code}
<testAccount>{data($admin/testAccount)}</testAccount>
</admin>,
for $private in $entry/privateMap
return
<private>
{$private/email}
<cancelReason>{data($private/cancelReason)}</cancelReason>
</private>
}
</entries>
这将为您提供缺少可选元素的空白元素。
好吧,试试这个
return
<entries>
{
for $admin in $entries/adminDataMap
return
<admin>
{$admin/code}
<testAccount>{data($admin/testAccount)}</testAccount>
</admin>,
for $private in $entries/privateMap
return
<private>
{$private/email}
<cancelReason>{data($private/cancelReason)}</cancelReason>
</private>
}
</entries>
我在BaseX和SqlServer上测试了这两种方法 - 两者都有效。
我想这一切都取决于你如何设置初始值
我在您的代码中看到root
:
let $entries := /root/entries
同时,在xml中没有root
名称的元素。
如果值设置如下,则此代码有效:
let $entries :=
<entries>
<!-- ... -->
</entries>