首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XQuery中的排序:嵌套FLWOR

XQuery中的排序:嵌套FLWOR
EN

Stack Overflow用户
提问于 2017-01-23 14:50:16
回答 2查看 234关注 0票数 0

我正在尝试使用XQuery对XML文档进行排序。第一级排序是按父元素之一进行排序。

第二级排序是链接的子元素之一。

代码语言:javascript
复制
<?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如下所示。

代码语言:javascript
复制
<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。请协助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-23 16:50:04

内部for需要迭代特性的子项,否则将只有一个项要迭代。此外,在树的更下面,必须删除LINKED_PROPERTIES,因为$ft已经在该节点上,并且必须按原样返回其他子节点。最后,这类测试不太正确(必须是child::element())。

代码语言:javascript
复制
<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中成功。

票数 1
EN

Stack Overflow用户

发布于 2017-01-23 16:48:44

如果你想测试FEATURE是否有chid元素LINKED_PROPERTIES

代码语言:javascript
复制
return if ($ft/LINKED_PROPERTIES) then 
    <LINKED_PROPERTIES_XXXXXXXX>
    {
        .....
    }
    </LINKED_PROPERTIES_XXXXXXXX>

您的XQuery尝试同样没有多大意义,它永远不会计算为true,因为它查找名为element ($ft/child::element)的子元素,并进一步测试元素名称是否等于"LINKED_PROPERTIES" (/name() eq "LINKED_PROPERTIES")。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41800672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档