需要帮助完成家庭作业。我有两个XML文件:Person.xml和passedExams.xml
Person.xml表单 - >
<listWrapper>
<items xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="person">
<address>Random street 2, Neverland</address>
<telephoneNumber>555-1-612-9999</telephoneNumber>
<name>Captain</name>
<sid>35168589</sid>
<surname>Obvious</surname>
</items>
<items xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="person">
<address>Random avenue, Neverland</address>
<telephoneNumber>555-1-123-9999</telephoneNumber>
<name>Gabe</name>
<sid>36431731</sid>
<surname>Newell</surname>
</items>
</listWrapper>
passExams.xml表单 - &gt;
<listWrapper>
<items xsi:type="passedExams" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<id>
<ExamID>BM3409</ExamID>
<sid>36431731</sid>
</id>
<month>7</month>
<grade>4</grade>
</items>
<items xsi:type="passedExams" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<id>
<ExamID>MV7402</ExamID>
<sid>36441189</sid>
</id>
<month>7</month>
<grade>4</grade>
</items>
</listWrapper>
使用这两个文件我试图列出在一年中的某个月通过x考试的所有人。例如,获取在一年中的第10个月通过2门考试的所有人。我在写一个好的查询时遇到了麻烦,因为我对它不好。这是我到目前为止所得到的:
for $exam in doc("pasedExams.xml")/listWrapper//items[month = 1]
where $person in doc("Person.xml")/listWrapper/items[$exam/sid = $person/sid] satisfies (count($exam/sid) = 2)
return
<info>
$person
</info>
此处x = 1且y = 2仅适用于演示。用户可以在程序启动时选择参数。为了澄清这背后的逻辑,我试图迭代1月份发生的考试,然后我试图将考试中的SID(学生ID)与Person.xml中的考试相匹配,然后我计算的数量SID在passExams中发生,因为SID的出现次数是该学生传递的测试次数。当我在Stylus Studio中运行时显示此错误: [DataDirect] [XQuery] [错误:XPST0003]第2行第14行出错。预期“返回”,但遇到“in”。 < / p>
我该如何做到这一点?
答案 0 :(得分:1)
您的错误声明清楚地说明了代码中的语法错误。您不能在where子句中使用该in
构造。
此外,您的FWLOR表达式并不代表您想要实现的目标:您希望输出所有用户,但是您会迭代每个考试,尽管这只是一个必需条件。所以它应该更像是:
for $user in doc("Person.xml")/listWrapper/items
where count(doc("passedExams.xml")/listWrapper/items[id/sid = $user/sid and month = 1]) >= 2
return $user
我现在不知道,但我猜这个grade
也会确定这个人是否真的通过了axam,或者失败了,所以你可能需要另外一个条件。
答案 1 :(得分:1)
你想要这样的东西:
let $numExams := 0,
$month := 1,
$Persons := doc("file:///c:/temp/delete/Person.xml"),
$PassedExams := doc("file:///c:/temp/delete/passedExams.xml")
return
for $p in $Persons/listWrapper/items
return
if($PassedExams/listWrapper/items
[xs:integer(month) eq $month and id/sid eq $p/sid]
[if($numExams gt 0)
then position() ge $numExams
else false()
]
or
$numExams le 0
and not($PassedExams/listWrapper/items
[xs:integer(month) eq $month and id/sid eq $p/sid]) )
then
(
<info>
{$p}
</info>
)
else ()
当使用提供的Person.xml
(从几个畸形中纠正)应用此XQuery(以及纯XPath 3.0表达式)时:
<listWrapper>
<items xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="person">
<address>Random street 2, Neverland</address>
<telephoneNumber>555-1-612-9999</telephoneNumber>
<name>Captain</name>
<sid>35168589</sid>
<surname>Obvious</surname>
</items>
<items xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="person">
<address>Random avenue, Neverland</address>
<telephoneNumber>555-1-123-9999</telephoneNumber>
<name>Gabe</name>
<sid>36431731</sid>
<surname>Newell</surname>
</items>
</listWrapper>
以及经过纠正和略微修改后的PassedExams.xml
:
<listWrapper>
<items xsi:type="passedExams" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<id>
<ExamID>BM3409</ExamID>
<sid>36431731</sid>
</id>
<month>1</month>
<grade>4</grade>
</items>
<items xsi:type="passedExams" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<id>
<ExamID>MV7402</ExamID>
<sid>36441189</sid>
</id>
<month>7</month>
<grade>4</grade>
</items>
<items xsi:type="passedExams" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<id>
<ExamID>CL3102</ExamID>
<sid>36431731</sid>
</id>
<month>1</month>
<grade>4</grade>
</items>
</listWrapper>
产生了想要的正确结果:
<info>
<items xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="person">
<address>Random avenue, Neverland</address>
<telephoneNumber>555-1-123-9999</telephoneNumber>
<name>Gabe</name>
<sid>36431731</sid>
<surname>Newell</surname>
</items>
</info>