xquery中基于复合键组合多个数组

时间:2021-04-12 13:32:15

标签: 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 合并。 谢谢

1 个答案:

答案 0 :(得分:1)

在 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>
}