![](/img/trans.png)
[英]XQuery: How to deal with multiple if-then-elses in a nested FLWOR statement?
[英]Sorting in XQuery: Nested FLWOR
我正在尝试使用XQuery对XML文档进行排序。 一级排序是通过父元素之一进行的。
第二级排序是链接的子元素之一。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<FEATURES xmlns="http://www.example.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<FEATURE>
<abbreviation>CANAL</abbreviation>
<LINKED_PROPERTIES>
<LP>
<abbreviation>zltinf</abbreviation>
<category>A</category>
<remarks />
</LP>
<LP>
<abbreviation>altalt</abbreviation>
<category>A</category>
<remarks />
</LP>
<LP>
<abbreviation>betbet</abbreviation>
<category>C</category>
<remarks />
</LP>
</LINKED_PROPERTIES>
<description>Water Canal</description>
<code>23</code>
<relation_type />
</FEATURE>
<FEATURE>
<abbreviation>AREA</abbreviation>
<LINKED_PROPERTIES>
<LP>
<abbreviation>zltzlt</abbreviation>
<category>A</category>
<remarks>zolt zolt</remarks>
</LP>
<LP>
<abbreviation>altalt</abbreviation>
<category>A</category>
<remarks />
</LP>
<LP>
<abbreviation>betbet</abbreviation>
<category>C</category>
<remarks />
</LP>
</LINKED_PROPERTIES>
<description>Area under administration</description>
<code>1</code>
<relation_type />
</FEATURE>
<FEATURE>
<abbreviation>BUOY</abbreviation>
<LINKED_PROPERTIES>
<LP>
<abbreviation>zltinf</abbreviation>
<category>A</category>
<remarks />
</LP>
<LP>
<abbreviation>altalt</abbreviation>
<category>A</category>
<remarks />
</LP>
<LP>
<abbreviation>betbet</abbreviation>
<category>C</category>
<remarks />
</LP>
<LP>
<abbreviation>infinf</abbreviation>
<category>A</category>
<remarks />
</LP>
<LP>
<abbreviation>altalt</abbreviation>
<category>A</category>
<remarks />
</LP>
<LP>
<abbreviation>betbet</abbreviation>
<category>C</category>
<remarks />
</LP>
</LINKED_PROPERTIES>
<description>Buoy on water</description>
<code>18</code>
<relation_type />
</FEATURE>
<FEATURE>
<abbreviation>DRONE</abbreviation>
<LINKED_PROPERTIES>
<LP>
<abbreviation>zltinf</abbreviation>
<category>A</category>
<remarks />
</LP>
<LP>
<abbreviation>beltam</abbreviation>
<category>A</category>
<remarks />
</LP>
<LP>
<abbreviation>betbet</abbreviation>
<category>C</category>
<remarks />
</LP>
</LINKED_PROPERTIES>
<description>Drones Inland</description>
<code>2</code>
<relation_type />
</FEATURE>
</FEATURES>
本文档包含两个级别的功能,属于一个标准。 因此很明显,我无法修改XML文档。 上面的数据是匿名数据。
我的XQuery如下所示。
<FEATURES xmlns="http://www.example.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
{
let $doc := doc("features.xml")
for $feature in $doc/FEATURES/FEATURE
order by $feature/abbreviation ascending
return
<FEATURE>
{
for $ft in $feature
return if ($ft/child::element/name() eq
"LINKED_PROPERTIES")then
<LINKED_PROPERTIES_XXXXXXXX>{
for $lp in $ft/LINKED_PROPERTIES/LP
order
by $lp/abbreviation ascending
return $lp
}
</LINKED_PROPERTIES_XXXXXXXX>
else $ft/*}
</FEATURE>
}
</FEATURES>
我无法在子级获得适当的相等条件,因此无法在子级获得所需的排序。
由于某些原因,我不想回到DOM / XSL。 请协助。
内部for
需求对功能的儿童迭代,否则会出现只有一个迭代的项目。 同样,在树的更下方,必须删除LINKED_PROPERTIES
因为$ ft已在该节点上,并且必须直接返回其他子项。 最后,种类测试不太正确(必须为child::element()
)。
<FEATURES xmlns="http://www.example.com/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">{
let $doc := doc("features.xml")
for $feature in $doc/FEATURES/FEATURE
order by $feature/abbreviation ascending
return <FEATURE>{
for $ft-child in $feature/child::element()
return if ($ft-child/name() eq "LINKED_PROPERTIES")
then <LINKED_PROPERTIES_XXXXXXXX>{
for $lp in $ft-child/LP
order by $lp/abbreviation ascending
return $lp
}</LINKED_PROPERTIES_XXXXXXXX>
else $ft-child
}</FEATURE>
}</FEATURES>
上面的查询在oXygen中成功。
如果您打算测试FEATURE
是否具有LINKED_PROPERTIES
元素LINKED_PROPERTIES
:
return if ($ft/LINKED_PROPERTIES) then
<LINKED_PROPERTIES_XXXXXXXX>
{
.....
}
</LINKED_PROPERTIES_XXXXXXXX>
您对XQuery尝试进行的操作没有多大意义,因为它会查找名为element
子element
( $ft/child::element
)并进一步测试元素名称是否等于"LINKED_PROPERTIES"
( /name() eq "LINKED_PROPERTIES"
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.