使用XQuery使用不同的条件返回多个属性

时间:2015-11-04 12:28:01

标签: xml xquery xquery-sql

我是XQuery的新手,我正在努力找出一些非常简单的东西,但我似乎失败了。 我在公司中有一个Employees的XML文件,如下所示:

<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

这对所有员工来说都是如此。我还有一个Dependents 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访问每个Employee,并且每个Dependent从Dependent.xml文件访问而不使用条件(WHERE $ e / superssn = $ m / essn)如何返回所有这些值,因为只有一个返回结果需要条件语句吗?

1 个答案:

答案 0 :(得分: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更容易阅读,而且不会花费你的费用。