首页 > 解决方案 > 在xquery中基于复合键组合多个数组

问题描述

我在基于 xquery 1.0 版中的 docNo 和 item_no 这两个键组合元素数组时遇到问题下面是给定的 xml 示例输入和输出

示例 XML 请求:

<text>
<element>
    <docNo>11111</docNo>
    <item_no>001</item_no>
    <text_line>SUPER  PROFILE</text_line>
</element>
<element>
    <docNo>1111</docNo>
    <item_no>001</item_no>
    <text_line>TOP SPOTS</text_line>
</element>
<element>
    <docNo>1111</docNo>
    <item_no>002</item_no>
    <text_line>SUPER PROFILE</text_line>
</element>
<element>
    <docNo>1111</docNo>
    <item_no>002</item_no>
    <text_line>TOP SPOTS</text_line>
</element>
<element>
    <docNo>2222</docNo>
    <item_no>002</item_no>
    <text_line>PROILE</text_line>
</element>

输出 :

<text>
<element>
    <docNo>11111</docNo>
    <item_no>001</item_no>
    <text>
        <text_line>SUPER  PROFILE</text_line>
        <text_line>TOP SPOTS</text_line>
    </text>
</element>
<element>
    <docNo>11111</docNo>
    <item_no>002</item_no>
    <text>
        <text_line>SUPER  PROFILE</text_line>
        <text_line>TOP SPOTS</text_line>
    </text>
</element>
<element>
    <docNo>2222</docNo>
    <item_no>002</item_no>
    <text>
        <text_line>PROFILE</text_line>
    </text>
</element>

我正在使用不同的值,但它与 item_no 001 和 002 合并。谢谢

标签: xquery

解决方案


在 XQuery 3 中,您将使用带有两个分组键的 group by 子句:

/*/element { node-name(.)  } {
    for $e at $pos in element
    group by $dn := $e/docNo, $in := $e/item_no
    order by head($pos)
    return
        <element>
        {
            head($e) ! (docNo, item_no),
            <text>
            {
                $e/text_line
            }
            </text>
        }
        </element>
}

在 XQuery 1 中,您可以使用distinct-values两个元素连接的键:

/*/element { node-name(.)  } {
    for $key in distinct-values(for $e in element return concat($e/docNo, '|', $e/item_no))
    let $group := element[concat(docNo, '|', item_no) = $key]
    return 
        <element>
        {
            $group[1]/(docNo | item_no),
            <text>
            {
                $group/text_line
            }
            </text>
        }
        </element>
}

推荐阅读