1

我有一个 XML 文档,

<resultsets>
    <row>
        <first_name>Georgi</first_name>
        <last_name>Facello</last_name>
    </row>
    <row>
        <first_name>Bezalel</first_name>
        <last_name>Simmel</last_name>
    </row>
    <row>
        <first_name>Bezalel</first_name>
        <last_name>Hass</last_name>
    </row>
</resultsets>

我想对名字进行排序并删除重复的名字来产生这个:

<resultsets>
    <row>
        <first_name>Bezalel</first_name>
        <last_name>Simmel</last_name>
    </row>
    <row>
        <first_name>Georgi</first_name>
        <last_name>Facello</last_name>
    </row>
</resultsets>

以下是我写的代码:

for $last_name at $count1 in doc("employees.xml")//last_name,
$first_name at $count2 in doc("employees.xml")//first_name
let $f := $first_name
where ( $count1=$count2 )
group by $f
order by $f
return 
<row> 
     {$f}
     {$last_name}
</row>

但是,此代码按名字对 XML 文档进行排序,但未能删除重复的名字 ('Bezalel'),它返回:

   <resultsets>
        <row>
            <first_name>Bezalel</first_name>
            <last_name>Simmel</last_name>
        </row>
        <row>
            <first_name>Bezalel</first_name>
            <last_name>Hass</last_name>
        </row>
        <row>
            <first_name>Georgi</first_name>
            <last_name>Facello</last_name>
        </row>
    </resultsets>

我知道如何使用两个 FLOWR 语句来解决这个问题。group by行为很奇怪,你能解释一下为什么它不删除重复项吗?有什么方法可以使用ONE FLOWR 循环并且只使用两个变量来解决这个问题?谢谢,$first_name$last_name

4

1 回答 1

2

我会简单地row按子元素对元素进行分组first_name,然后输出每个组中的第一项,以确保您不会得到重复项:

<resultssets>
{
    for $row in resultsets/row
    group by $fname := $row/first_name
    order by $fname
    return
        $row[1]    
}
</resultssets>

http://xqueryfiddle.liberty-development.net/jyyiVhf

至于该group by子句的工作方式,请参阅https://www.w3.org/TR/xquery-31/#id-group-by其中说:

group by 子句将每个分组前元组分配给一个组,并为每个组生成一个分组后元组。在一个组的分组后元组中,每个分组键由一个在 GroupingSpec 中指定的变量表示,并且出现在分配给该组的分组前元组中的每个变量都由一个相同的变量表示名称,绑定到绑定到任何这些预分组元组中的变量的所有值的序列。

于 2018-02-17T10:08:03.060 回答