我有一个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
两个变量来解决此问题?谢谢,
答案 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中指定,以及出现在的每个变量 分配给该组的预分组元组是 由同名变量表示,绑定到所有序列 在任何这些预分组元组中绑定到变量的值。