2014-03-29 86 views
0

我有一個xml文件。

<?xml version = "1.0" encoding = "UTF -8"?> 
<library> 
<books> 
    <book> 
     <title>The story of My Life</title> 
     <accessionNumber val = "1"/> 
    </book> 
    <book> 
     <title>The Parody</title> 
     <accessionNumber val = "2"/> 
    </book> 
    <book> 
     <title>The Automata Theory</title> 
     <accessionNumber val = "3"/> 
    </book> 
</books> 
<loans> 
    <loan book="1" user="35" dueDate="2006-April-10-05:00"/> 
    <loan book="2" user="36" dueDate="2015-May-10-05:00"/> 
    <loan book="3" user="36" dueDate="2014-November-10-05:00"/> 
</loans> 
<users> 
    <user> <name> Fred Jones</name> <id val = "35"/> </user> 
    <user> <name> Aadeem Nus</name> <id val = "36"/> </user> 
</users> 

我必須要找到(a)所有的貸款,按用戶名

(二)用戶借了一本書

我對溶液(排序列表)我解決了。解決XQuery是:

for $u in doc("lib.xml")//user 
for $l in doc("lib.xml")//loan 
where $l/@user = $u/id/@val 
order by $u/name 
return $u/name 

但它花了很長時間,因爲我與

for $u in doc("lib.xml")//users 
for $l in doc("lib.xml")//loans 
where $l/loan/@user = $u/user/id/@val 
order by $u/user/name 
return $u/user/name 

想我看到他們之間沒有什麼區別。有什麼不同? (b)與(a)相同的問題。我解決了很長時間。解決一個:

for $u_n in doc("lib.xml")//user 
for $x at $xPos in doc("lib.xml")//loan 
for $y at $yPos in doc("lib.xml")//loan 
where $x/@user = $y/@user 
and $xPos < $yPos 
and $u_n/id/@val = $x/@user 
return data($u_n/name) 

而尚未解決的一個(爲解決一個根據我這是相同的):

for $u_n in doc("lib.xml")//user 
for $x at $xPos in doc("lib.xml")//loans 
for $y at $yPos in doc("lib.xml")//loans 
where $x/loan/@user = $y/loan/@user 
and $xPos < $yPos 
and $u_n/id/@val = $x/loan/@user 
return data($u_n/name) 

任何人都可以請您給解釋?

謝謝。

+0

關鍵的一點是,對於' $ y in // loans'將在循環的每一步都指定一個''元素,並試圖解決貸款/貸款顯然是失敗的。所有其他迭代都是一樣的。 – raina77ow

+0

這看起來更像是一串長長的家庭作業問題,而不是一個特定的技術問題。 SO是後者更好的論壇。 –

+0

它已經解決了。我的問題是有什麼區別,爲什麼它不起作用? – Nusrat

回答

1

原因

for $u in doc("lib.xml")//user 
for $l in doc("lib.xml")//loan 
where $l/@user = $u/id/@val 
order by $u/name 
return $u/name 

for $u in doc("lib.xml")//users 
for $l in doc("lib.xml")//loans 
where $l/loan/@user = $u/user/id/@val 
order by $u/user/name 
return $u/user/name 

之間的差異......是,只有在個別user元素前者迭代。第二個「遍歷」users元素,其中只有一個元素,因此完全不會發生實際的迭代。

當你讓$lloans和使用$l/loan/@user,你問如果在所有任何貸款包含一個比賽 - 不與任何特異性的貸款匹配尋找,因爲$l沒有指向單筆貸款!因此,您的return表達式無法解決特定的匹配問題,因爲其$l未查看單個匹配的loan,而是查看其聯合父項loans


類似地,僅for $x at $xPos in doc("lib.xml")//loans找到一個loans元件;它並沒有看它裏面的loan元素,因爲你沒有告訴它這樣做。

如果你想$x成爲loan元素,不是loans元素,你需要或者解決它,你已經做的方式,或做到這一點:

for $x at $xPos in doc("lib.xml")//loans/* 
+0

感謝您的最後一個選項;現在很清楚。 – Nusrat