xquery - 在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 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>
}
推荐阅读
- biztalk - 是否可以让 2 个 BizTalk Server 节点从单个 MessageBox 运行?
- c# - DateTime 作为类通用约束
- flutter - 在列表生成器中使用单选按钮
- javascript - 同步函数的执行速度比异步函数快吗?
- cassandra - 为什么基于第一个聚类键的查询需要 ALLOW FILTERING?
- elasticsearch - Elasticsearch path.logs 无法正常工作
- java - 继承时获取泛型参数的泛型参数
- python - 是否有一种干净的方法可以仅在第一次迭代时或在执行之前检查循环内的变量?
- php - 找不到 Symfony 页面(Symfony 3)
- visual-studio - C++ zbar 库 - 未解析的外部符号