2017-03-27 105 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