XQuery 中的排序:嵌套 FLWOR
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 有几个原因。请协助。
如果你想测试 FEATURE
是否有 chid 元素 LINKED_PROPERTIES
:
return if ($ft/LINKED_PROPERTIES) then
<LINKED_PROPERTIES_XXXXXXXX>
{
.....
}
</LINKED_PROPERTIES_XXXXXXXX>
您的 XQuery 尝试没有多大意义,它永远不会评估为真,因为它会查找名为 element
($ft/child::element
) 的子元素并进一步测试元素名称是否等于 "LINKED_PROPERTIES"
(/name() eq "LINKED_PROPERTIES"
).
里面的for
需要对feature的children进行迭代,否则只会迭代一个item。此外,在树的更下方,必须删除 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中成功。
我正在尝试使用 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 有几个原因。请协助。
如果你想测试 FEATURE
是否有 chid 元素 LINKED_PROPERTIES
:
return if ($ft/LINKED_PROPERTIES) then
<LINKED_PROPERTIES_XXXXXXXX>
{
.....
}
</LINKED_PROPERTIES_XXXXXXXX>
您的 XQuery 尝试没有多大意义,它永远不会评估为真,因为它会查找名为 element
($ft/child::element
) 的子元素并进一步测试元素名称是否等于 "LINKED_PROPERTIES"
(/name() eq "LINKED_PROPERTIES"
).
里面的for
需要对feature的children进行迭代,否则只会迭代一个item。此外,在树的更下方,必须删除 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中成功。