XQuery滚动窗口:按第一个窗口的开始项分组



使用BaseX 9.7.3,我有一个使用tumbling window子句生成的名称排序列表。

数据片段如下所示:

<data>
<group>
<key id="0c7b0bca-0349-489c-b45f-2612f3134a76">ovid</key>
<key id="f77ab9c2-0be3-4348-809d-ab245e630f81">ovid 43 b c-17 or 18 a d</key>
</group>
<group>
<key id="39b9d6c2-85a5-4c72-a83e-2a52e548fc3b">ovid 43 bc</key>
<key id="acf5b3c0-8fd4-4e0c-950b-a40683bab431">ovid 43 bc-17 ad</key>
<key id="cc57be53-9ca8-4b5e-97cf-1aeca798cded">ovid 43 bc-17 ad or 18 a</key>
<key id="8395e750-1e52-4152-9d37-8c8f4e389fd3">ovid 43 bc-17 ad or 18 ad</key>
</group>
<group>
<key id="0be07fc6-d9bf-4d56-8352-1885b4dd6574">ovid 43 bc-17 or 18</key>
<key id="e3aafc69-56b0-4632-a96c-26ca448c6c2d">ovid 43 bc-17 or 18 ad</key>
</group>
<group>
<key id="f9615365-4a32-442b-9e20-9c5abb0e6fa0">ovide</key>
<key id="c7b45a8d-79a3-4e79-b32b-8d918f67a7b0">ovide 0043 av j-c-0017</key>
</group>
</data>

我想进一步对数据进行分组,以便在本例中,组以"ovid"开头。并以"公元前43年至公元17年或18年"结尾。

所需输出:

<data>
<group>
<key id="0c7b0bca-0349-489c-b45f-2612f3134a76">ovid</key>
<key id="f77ab9c2-0be3-4348-809d-ab245e630f81">ovid 43 b c-17 or 18 a d</key>  
<key id="39b9d6c2-85a5-4c72-a83e-2a52e548fc3b">ovid 43 bc</key>
<key id="acf5b3c0-8fd4-4e0c-950b-a40683bab431">ovid 43 bc-17 ad</key>
<key id="cc57be53-9ca8-4b5e-97cf-1aeca798cded">ovid 43 bc-17 ad or 18 a</key>
<key id="8395e750-1e52-4152-9d37-8c8f4e389fd3">ovid 43 bc-17 ad or 18 ad</key>  
<key id="0be07fc6-d9bf-4d56-8352-1885b4dd6574">ovid 43 bc-17 or 18</key>
<key id="e3aafc69-56b0-4632-a96c-26ca448c6c2d">ovid 43 bc-17 or 18 ad</key>
</group>
<group>
<key id="f9615365-4a32-442b-9e20-9c5abb0e6fa0">ovide</key>
<key id="c7b45a8d-79a3-4e79-b32b-8d918f67a7b0">ovide 0043 av j-c-0017</key>
</group>
</data>

我有以下查询,但它只是复制输入文档:

<data>{
for tumbling window $entry in /*/group/key  
start $s at $sp previous $sprev next $snext when starts-with($snext, $s)
end $e at $ep next $enext when not(starts-with($enext, $e)) 
return  
<group>{
for $k in $entry
return (
<key id="{$k/@id}">{data($k)}</key>
)      
}</group>         
}</data>

是否可以比较第一组的开始项("ovid")和以该标记开始的后续条目?我想排除"尽管它以"ovid.">

开头

使用Saxon支持的扩展(类似Java的)正则表达式

for tumbling window $w in /data/group/key
start $s when true()
end next $n when not(matches($n, '^' || $s || 'b', ';j'))
return 
<group>{$w}</group>

给出你想要的两组。

我现在也检查了';j'标志在BaseX 9.7.2中也可以工作。

最新更新