为什么group by $ variable/@属性不起作用?

fal*_*lla 2 xml xquery flwor basex xquery-3.0

问题背景

鉴于每个家庭的类别......

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <family>
        <categories>
            <cat id="1" />
            <cat id="2" />
        </categories>
    </family>
    <family>
        <categories>
            <cat id="3" />
            <cat id="5" />
        </categories>
    </family>
    <family>
        <categories>
            <cat id="3" />
            <cat id="5" />
            <cat id="6" />
        </categories>
    </family>
</root>
Run Code Online (Sandbox Code Playgroud)

我想要家庭最常见的类别......

<common-family-category id="3" count="2"/>
<common-family-category id="5" count="2"/>
Run Code Online (Sandbox Code Playgroud)

成功的尝试

我可以通过对每个迭代的id进行分组来实现该结果...

for $family-category-id in //family/categories/cat/@id
count $return-indexes
group by $family-category-id
order by count($return-indexes) descending
where count($return-indexes) > 1
return
<common-family-category id="{$family-category-id}" count="{count($return-indexes)}" />
Run Code Online (Sandbox Code Playgroud)

并且通过迭代每个类别并将id存储在变量中......

for $family-category in //family/categories/cat
let $family-category-id := $family-category/@id
count $return-indexes
group by $family-category-id
order by count($return-indexes) descending
where count($return-indexes) > 1
return
<common-family-category id="{$family-category-id}" count="{count($return-indexes)}" />
Run Code Online (Sandbox Code Playgroud)

尝试失败

但我无法通过迭代类别并直接对id进行分组来实现这一点......

for $family-category in //family/categories/cat
count $return-indexes
group by $family-category/@id
order by count($return-indexes) descending
where count($return-indexes) > 1
return
<common-family-category id="{$family-category/@id}" count="{count($return-indexes)}" />
Run Code Online (Sandbox Code Playgroud)

它在以下错误中给出以下错误group by $family-category/@id:

[XPST0003]在"分组依据"之后期待有效表达

由于设置$family-category/@id进入$family-category-id和分组它的工作...

为什么$family-category/@id直接分组不起作用?

如果这真的不起作用,那是什么原因?

Mic*_*Kay 5

基本上,XQuery 3.0中有两种形式的分组子句

一般形式是

group by $var := key-expression
Run Code Online (Sandbox Code Playgroud)

其中$ var定义将引用该组的变量,key-expression是计算分组键的表达式.

如果你发现自己在写作

group by $var := $var
Run Code Online (Sandbox Code Playgroud)

那么你可以将其缩写为更方便的简写

group by $var
Run Code Online (Sandbox Code Playgroud)

但你不能写

group by key-expression
Run Code Online (Sandbox Code Playgroud)

不声明分组变量,除了键表达式是简单变量引用的特殊情况.