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

Using XQuery to return multiple attributes using different conditions

我是 XQuery 的新手,我试图找出一些非常简单的东西,但我似乎失败得很惨。 我有一个公司员工的 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,其中 return 是受抚养人的姓名、与该受抚养人相关的雇员的名字和姓氏以及名字以及该员工经理的姓氏。 我在访问经理信息时遇到了麻烦,因为必须将经理的 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>

所以我想我的具体问题是: 既然我可以在不使用条件 (WHERE $e/superssn = $m/essn) 的情况下从 Employee.xml 访问每个 Employee 并从 Dependent.xml 文件访问每个 Dependent 我怎么能 return 所有这些值,因为只有一个 returned 结果需要条件语句?

我不完全明白你的实际问题以及为什么你不想成为条件,但在我看来是因为你在 XQuery 中遗漏或混淆了一些概念。

首先,如果你写

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

这是三个交错的for循环,看起来完全没有必要。如果我理解正确的话,你想要一名员工和所有 his/her 家属以及员工经理。您应该为此使用 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 更容易阅读,而且不花一分钱。