2017-03-27 75 views
3

所以我想在for子句中插入函数distint-nodes(请参阅下面的内容)。我为此使用BaseX。XQuery不同节点的使用

这是我的代码:

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

我想用第一此功能,所以它只返回我<autor/>元素的唯一实例:

for $b in distinct-nodes($a/autor) 
     return concat($b/nombre,' ',$b/apellido) 

,但我得到以下错误(B​​aseX查询信息):

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

你说此功能存在。谁告诉你的? –

+0

然后我误解了fn和functx之间的区别,可能是这样吗? – JD0001

+0

......对,就是这样。 –

回答

4

没有标准XQuery函数fn:distinct-nodes(...)和XQuery只知道fn:distinct-values(...)

第三方XQuery函数库functx知道functx:dinstinct-nodes(...) function,该函数再次实现为标准XQuery函数。该库可以是downloaded并作为大多数XQuery实现的模块导入,因为它只使用标准的XQuery函数。

如果所有<autor/>元素都包含作者姓名,请考虑应用fn:distinct-values(...),然后重新创建<autor/>元素。

由于性能方面的原因,如果编译时间增加太多(库很大),只提取所需函数可能是合理的。另外请注意,一些函数具有更快的XQuery 3.0版本,充分利用了新的语言功能。

fn是默认的XQuery函数名称空间funct由函数库定义的名称空间。

+0

谢谢。在这种情况下,我们的老师只会显示一点点语言,他们不会正确地做或不向我们解释****。对于我的错误感到抱歉,并且对使用这种语言的人感到抱歉,也对我的英语感到抱歉。 – JD0001

+1

不要担心,XQuery(以及函数式编程的整个概念)不容易入门,但这种努力是值得的。 –

2

任何包含“/”运算符的路径表达式都会自动消除重复的节点,因此编写functx:distinct-nodes($a/autor)是完全多余的,它将始终返回与$a/autor完全相同的结果。

但我怀疑你误解了functx:distinct-nodes()的功能。如果您有结构

<authors> 
<author>John Smith</author> 
<author>John Smith</author> 
</authors> 

那么这两个authors/authorfunctx:distinct-nodes(authors/author)将返回两个<author>元素。他们被认为是不同的,因为他们是可区分的(例如,一个兄弟姐妹之前,另一个没有)。如果你想把它们当作重复对象,那么你需要首先准确地定义重复的含义(也许你想要的定义是它们在fn:deep-equal函数意义上是深层平等的),然后你需要采取不同的方法。

更高版本:

在你编辑的问题,你说这是什么意思的两位作者是(非)不同的:” ......其中$ A /作者日期/农布雷和$ A/autor/apellidos文本值是相同的“。

所以最好把它看作是一个分组问题:将$ a/autor/nombre和$ a/autor/apellidos相同的元素进行分组,然后从每个组中选择一个元素。

在XQuery中3.0分组“按组” FLWOR表达式的子句中使用完成:

for $a in autor 
group by $n := $a/nombre, $ap := $a/appellidos 
return $a[1] 

。1.0它更笨拙,你通常喜欢写东西

let $keys := distinct-values(autor/concat(nombre, '~', appellidos)) 
for $key in $keys 
return /autor[concat(nombre, '~', appellidos) = $key][1] 
+0

我想我的问题是,我需要去申请一些函数返回不同的市长元素$ A /作者日期,以实现下一个代码,'回报CONCAT($ B /农布雷,””,$ B/apellido)'只会返回作者不同实例的文本。据我所知,'for'子句在每个'$ a/autor'元素之间迭代,所以在'fn:concat'中应用'fn:distinct-values'不会工作,因为我希望 – JD0001

+0

谢谢。这对我来说非常有帮助,把同样的元素作为一个群体对待的方式对我来说是关键 – JD0001