xquery组不会消除重复的项目

时间:2018-02-16 20:14:35

标签: xpath xquery xquery-3.0

我有一个XML文档,

import socket
mysocket = socket.socket(2,1)
mysocket.bind(('',80))
mysocket.listen(5)


cli2,addr2 = mysocket.accept()
print('Client connected')
status = b'HTTP/1.1 200 OK\r\n'
connection_type=b'Connection: close\r\n'
content_type = b'Content-Type: text/html\r\n'  
server = b'Server: Python-Server/5.2\r\n\r\n'
f = open('c:/users/totz/documents/index.html','r')
data = f.read()
data_b = data.encode()
content_html_length_calculation = len(data) * 8
content_length_header = 'Content-Length: ' + str(content_html_length_calculation) + '\r\n'
content_length_header_b = content_length_header.encode()
sending_data = status + connection_type + content_length_header_b + content_type + server
cli2.send(sending_data)
print('Data sent')
mysocket.close()

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

<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>

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

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>

我知道如何使用两个FLOWR语句来解决这个问题。 <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> 行为很奇怪,你能否解释为什么它不会删除重复项? 我们有什么方法可以使用 ONE FLOWR循环和使用group by$first_name两个变量来解决此问题?谢谢,

1 个答案:

答案 0 :(得分: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中指定,以及出现在的每个变量   分配给该组的预分组元组是   由同名变量表示,绑定到所有序列   在任何这些预分组元组中绑定到变量的值。