XQuery 不同节点的使用
XQuery distinct-nodes usage
所以我想在 for
子句中插入函数 distint-nodes
(见下文)。为此,我正在使用 BaseX。
这是我的代码:
<autores>{
for $a in doc("libros.xml")//libro
return
<autor>
<nombre>{
for $b in $a/autor
return concat($b/nombre,' ',$b/apellido)
}
</nombre>
{
for $c in doc("libros.xml")//libro
where $c/autor = $a/autor
return $c/titulo
}
</autor>
}
</autores>
我想在第一个 for 中使用这个函数,所以它只是 returns 我 <autor/>
元素的唯一实例:
for $b in distinct-nodes($a/autor)
return concat($b/nombre,' ',$b/apellido)
但我收到以下错误(BaseX 查询信息):
Error:
Stopped at G:/Pruebas XML/XML/xqueryLibros.xq, 6/31:
[XPST0017] Unknown function: fn:distinct-nodes.
为什么这个函数存在时却不为人知?有什么我想念的吗?
编辑: 我的目的是获取元素 $a/autor
的唯一实例,其中 $a/autor/nombre
和 $a/autor/apellidos
文本值相同
<autores>
<autor>
<nombre>W. Stevens</nombre>
<titulo>TCP/IP Ilustrado</titulo>
<titulo>Programación Avanzada en el entorno Unix</titulo>
</autor>
<autor>
<nombre>W. Stevens</nombre>
<titulo>TCP/IP Ilustrado</titulo>
<titulo>Programación Avanzada en el entorno Unix</titulo>
</autor>
<autor>
<nombre>Serge Abiteboul Peter Buneman Dan Suciu</nombre>
<titulo>Datos en la Web</titulo>
</autor>
<autor>
<nombre/>
</autor>
</autores>
没有标准的 XQuery 函数 fn:distinct-nodes(...)
,XQuery 只知道 fn:distinct-values(...)
.
第三方 XQuery 函数库 functx
知道 functx:dinstinct-nodes(...)
function, which is again implemented as standard XQuery functions. The library can be downloaded 并作为模块导入大多数 XQuery 实现,因为它只使用标准 XQuery 函数。
如果所有 <autor/>
元素都包含作者姓名,请考虑改为应用 fn:distinct-values(...)
,然后重新创建 <autor/>
元素。
出于性能原因,如果编译时间增加太多(库相当大),只提取所需的函数可能是合理的。另请注意,一些函数具有更快的 XQuery 3.0 对应函数,利用了新的语言功能。
fn
是默认的 XQuery 函数命名空间,funct
是函数库定义的命名空间。
任何包含“/”运算符的路径表达式都会自动剔除重复节点,所以写functx:distinct-nodes($a/autor)
完全是多余的,它总是return和$a/autor
完全一样的结果。
但我怀疑您误解了 functx:distinct-nodes()
的作用。如果你有结构
<authors>
<author>John Smith</author>
<author>John Smith</author>
</authors>
那么 authors/author
和 functx:distinct-nodes(authors/author)
都会 return 两个 <author>
元素。它们被认为是不同的,因为它们是可区分的(例如,一个有前面的兄弟姐妹,另一个没有)。如果您想将它们视为重复项,那么您首先需要准确定义重复项的含义(也许您想要的定义是它们在 fn:deep-equal 函数的意义上是深度相等的),然后您需要采用不同的方法。
稍后:
在您对问题的编辑中,您已经说明了两位作者(非)不同的含义:“...其中 $a/autor/nombre 和 $a/autor/apellidos 文本值是一样”。
所以最好将此视为分组问题:将 $a/autor/nombre 和 $a/autor/apellidos 相同的元素分组,然后 select 每组中的一个元素。
在 XQuery 3.0 中,分组是使用 FLWOR 表达式的 "group by" 子句完成的:
for $a in autor
group by $n := $a/nombre, $ap := $a/appellidos
return $a[1]
在 XQuery 1.0 中,它更加笨拙,您通常会这样写
let $keys := distinct-values(autor/concat(nombre, '~', appellidos))
for $key in $keys
return /autor[concat(nombre, '~', appellidos) = $key][1]
所以我想在 for
子句中插入函数 distint-nodes
(见下文)。为此,我正在使用 BaseX。
这是我的代码:
<autores>{
for $a in doc("libros.xml")//libro
return
<autor>
<nombre>{
for $b in $a/autor
return concat($b/nombre,' ',$b/apellido)
}
</nombre>
{
for $c in doc("libros.xml")//libro
where $c/autor = $a/autor
return $c/titulo
}
</autor>
}
</autores>
我想在第一个 for 中使用这个函数,所以它只是 returns 我 <autor/>
元素的唯一实例:
for $b in distinct-nodes($a/autor)
return concat($b/nombre,' ',$b/apellido)
但我收到以下错误(BaseX 查询信息):
Error: Stopped at G:/Pruebas XML/XML/xqueryLibros.xq, 6/31: [XPST0017] Unknown function: fn:distinct-nodes.
为什么这个函数存在时却不为人知?有什么我想念的吗?
编辑: 我的目的是获取元素 $a/autor
的唯一实例,其中 $a/autor/nombre
和 $a/autor/apellidos
文本值相同
<autores>
<autor>
<nombre>W. Stevens</nombre>
<titulo>TCP/IP Ilustrado</titulo>
<titulo>Programación Avanzada en el entorno Unix</titulo>
</autor>
<autor>
<nombre>W. Stevens</nombre>
<titulo>TCP/IP Ilustrado</titulo>
<titulo>Programación Avanzada en el entorno Unix</titulo>
</autor>
<autor>
<nombre>Serge Abiteboul Peter Buneman Dan Suciu</nombre>
<titulo>Datos en la Web</titulo>
</autor>
<autor>
<nombre/>
</autor>
</autores>
没有标准的 XQuery 函数 fn:distinct-nodes(...)
,XQuery 只知道 fn:distinct-values(...)
.
第三方 XQuery 函数库 functx
知道 functx:dinstinct-nodes(...)
function, which is again implemented as standard XQuery functions. The library can be downloaded 并作为模块导入大多数 XQuery 实现,因为它只使用标准 XQuery 函数。
如果所有 <autor/>
元素都包含作者姓名,请考虑改为应用 fn:distinct-values(...)
,然后重新创建 <autor/>
元素。
出于性能原因,如果编译时间增加太多(库相当大),只提取所需的函数可能是合理的。另请注意,一些函数具有更快的 XQuery 3.0 对应函数,利用了新的语言功能。
fn
是默认的 XQuery 函数命名空间,funct
是函数库定义的命名空间。
任何包含“/”运算符的路径表达式都会自动剔除重复节点,所以写functx:distinct-nodes($a/autor)
完全是多余的,它总是return和$a/autor
完全一样的结果。
但我怀疑您误解了 functx:distinct-nodes()
的作用。如果你有结构
<authors>
<author>John Smith</author>
<author>John Smith</author>
</authors>
那么 authors/author
和 functx:distinct-nodes(authors/author)
都会 return 两个 <author>
元素。它们被认为是不同的,因为它们是可区分的(例如,一个有前面的兄弟姐妹,另一个没有)。如果您想将它们视为重复项,那么您首先需要准确定义重复项的含义(也许您想要的定义是它们在 fn:deep-equal 函数的意义上是深度相等的),然后您需要采用不同的方法。
稍后:
在您对问题的编辑中,您已经说明了两位作者(非)不同的含义:“...其中 $a/autor/nombre 和 $a/autor/apellidos 文本值是一样”。
所以最好将此视为分组问题:将 $a/autor/nombre 和 $a/autor/apellidos 相同的元素分组,然后 select 每组中的一个元素。
在 XQuery 3.0 中,分组是使用 FLWOR 表达式的 "group by" 子句完成的:
for $a in autor
group by $n := $a/nombre, $ap := $a/appellidos
return $a[1]
在 XQuery 1.0 中,它更加笨拙,您通常会这样写
let $keys := distinct-values(autor/concat(nombre, '~', appellidos))
for $key in $keys
return /autor[concat(nombre, '~', appellidos) = $key][1]