2015-05-12 79 views
0

我已經得到了與此結構的XML文件:無法遍歷的元素和XML文件使用XQuery

<profiles> 
    <profile profile="SuperAdministrator" name="admin"/> 
    <profile project="TesteHandSpy" profile="Researcher" name="john"/> 
    <profile project="DunnProject,DAAR1_op,Sara" profile="Researcher" name="juliete"/> 
</profiles> 

而且我想一定值來選擇輪廓元素的項目價值屬性名稱。我開始嘗試列出所有配置文件元素,並且遇到問題。我可以找到該文件,但後來我使用了在幾處找到的命令,並返回了零結果。這裏是我測試的xquery:

let $param := "juliete" 
let $profiles:= doc("/db/db_project/profiles.xml")/profiles/profile 

for $profile in $profiles 
return $profile 

你能幫助我嗎?我想當這個開始工作時,我所要做的就是將[@ name = $ param]添加到查詢中。

+0

哪個處理器?你確定路徑是正確的嗎?您正在使用的xquery是正確的列出所有配置文件。 –

+0

@EwoutGraswinckel如果我刪除「/ profiles/profile」它顯示我的文件的內容,所以我想這意味着我的路徑是正確的。我也試圖把「/ /個人資料」,它沒有工作。 – patricia

+0

@EwoutGraswinckel我試圖用xquery 3.0的eXist-db – patricia

回答

1

這裏不需要FLOWR表達式。一個簡單的路徑會做:

doc("/db/db_project/profiles.xml")/profiles/profile[@name eq $param]

,這回沒有什麼能有幾個原因的事實。最明顯的是1)URI不正確(嘗試使用相同的URI調用doc()以確保它返回文檔)或2)命名空間問題(您可以嘗試*:profiles/*:profile來驗證情況並非如此)。

使用doc()的問題在於它不能在其他人的機器上重現。如果您將文檔的內容放在變量中,則該查詢將是自包含的,我們將能夠提供更好的幫助。

更新

您的評論後,現在看來,這是一個命名空間的問題。所以你上面引用的XML輸入並不完全正確。它缺乏一些命名空間,像:

<profiles xmlns="http://example.org/project"> 
    ... 
</profiles> 

/profiles/profile的路徑返回元素profile,元素profiles的孩子,都沒有命名空間。要訪問那些在特定的命名空間,你必須綁定一個前綴,該命名空間URI,然後再使用前綴每個元素的名稱:

declare namespace p = "http://example.org/project"; 
doc("/db/db_project/profiles.xml")/p:profiles/p:profile[@name eq $param] 

你必須明白的是,在查詢中使用的前綴(中這種情況下p)和XML中使用的一個(在這種情況下沒有前綴,因爲URI被綁定爲默認名稱空間)不必匹配。它們都綁定的URI必須匹配。

+0

謝謝你,*:profiles/*:profile xquery正在工作。你能向我解釋爲什麼/簡介/簡介不起作用嗎? – patricia

+1

當然,我已經在上面更新了我的答案。 –

+0

謝謝你的解釋:) – patricia