我在基于 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 合并。 谢谢
答案 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>
}