2015-11-04 64 views
0

我是XQuery的新手,我試圖找出一些非常簡單的東西,但我似乎很失敗。 我公司員工的XML文件中的一個公司,看起來像這樣:使用XQuery返回使用不同條件的多個屬性

<dataroot> 


<employee> 


    <fname>John</fname> 


    <minit>B</minit> 


    <lname>Smith</lname> 


    <ssn>123456789</ssn> 


    <bdate>1965-01-09</bdate> 


    <address>731 Fondren, Houston, TX</address> 


    <sex>M</sex> 


    <salary>30000</salary> 


    <superssn>333445555</superssn> 


    <dno>5</dno> 


</employee> 


<employee> 


    <fname>Franklin</fname> 


    <minit>T</minit> 


    <lname>Wong</lname> 


    <ssn>333445555</ssn> 


    <bdate>1955-12-08</bdate> 


    <address>638 Voss, Houston, TX</address> 


    <sex>M</sex> 


    <salary>40000</salary> 


    <superssn>888665555</superssn> 


    <dno>5</dno> 


</employee> 
...etc 

而這正好爲所有僱員。我也有類似如下的家屬XML文件:

<dependent> 


    <essn>123456789</essn> 


    <dependent_name>Alice</dependent_name> 


    <sex>F</sex> 


    <bdate>1988-12-30</bdate> 


    <relationship>daughter</relationship> 


</dependent> 


<dependent> 


    <essn>123456789</essn> 


    <dependent_name>Elizabeth</dependent_name> 


    <sex>F</sex> 


    <bdate>1967-05-05</bdate> 


    <relationship>spouse</relationship> 


</dependent> 
...and so on 

我的問題是,我試圖運行,返回的依賴,名字的名字和姓氏的XQuery與該受撫養人有關的僱員以及該僱員經理的名字和姓氏。 由於經理的ssn必須與員工的ssn進行比較以獲取經理的姓名(普通員工和經理都是員工檔案的一部分),所以我在訪問經理信息時遇到了麻煩。

這是我到目前爲止有:

<results> 
{ 
    for $e in doc("../company/employee.xml")//employee, 
     $m in doc("../company/employee.xml")//employee 
     $d in doc("../company/dependent.xml")//dependent 
    return 
     <ans 
      dname="{ $d/dependent_name }" 
      emp fname="{ $e/fname }" 
      emp lname="{ $e/lname }" 
      mgr fname="{ } (: *this is where I get lost* :) 
     /> 
} 
</results> 

所以我想我的具體問題是: 看到,因爲我可以訪問從Employee.xml每個員工,並從Dependent.xml文件中的每個相關WITHOUT使用條件(WHERE $ e/superssn = $ m/essn)如何返回所有這些值,因爲只有一個返回的結果需要條件語句?

回答

0

我並不完全明白你的實際問題,你爲什麼不想要一個條件,但在我看來,因爲你在XQuery中缺少或混合了一些概念。

首先,如果你寫

for $e in doc("../company/employee.xml")//employee, 
    $m in doc("../company/employee.xml")//employee 
    $d in doc("../company/dependent.xml")//dependent 

這三個交錯for循環,這似乎完全沒有必要。如果我理解正確,你想得到一名僱員和他所有的家屬和僱員經理。您應該使用let

for $e in doc("../company/employee.xml")/dataroot/employee 
for $d in doc("../company/dependent.xml")//dependent[essn = $e/ssn] 
let $m in doc("../company/employee.xml")/dataroot/employee[ssn = $e/superssn] 
return 
    <ans 
     dname="{ $d/dependent_name }" 
     emp fname="{ $e/fname }" 
     emp lname="{ $e/lname }" 
     mgr fname="{ $m/fname } 
    /> 

我也換成//有一個具體步驟。你應該儘量避免//,因爲它必須搜索整個樹,這可能會很大。

請使用比$m更有意義的變量名稱。 $manager更容易閱讀,並且不會花費你一些東西。

+0

這幫了很多,非常感謝!我絕對誤解了'讓'的正確使用,因此我更加困惑。我會接受你的建議,並採取具體措施。非常有幫助,再次感謝。 – mugiwaragirl

+0

@ mugiwaragirl投票(如果它解決了你接受答案的問題),答案是在SO上說「謝謝」。並且看到你是一個經驗不足的用戶(基於你的代表):歡迎來到SO :)當然也是奇妙的XQuery世界;) – dirkk

+0

是的,我是全新的,你怎麼知道? ;)我感謝熱烈的歡迎! – mugiwaragirl