Xml 用于if-then-else意外输出的Xquery
我试图返回一些输出,但遇到了一些困难,很可能是我对if-then--else语句的Xquery没有正确的理解Xml 用于if-then-else意外输出的Xquery,xml,xquery,Xml,Xquery,我试图返回一些输出,但遇到了一些困难,很可能是我对if-then--else语句的Xquery没有正确的理解 for $S in doc("prac5a.xml")/enrolment return <enrolment>{ for $s in//student, $e in//enrol return if($s/id = $e/stud) then <student>{$s/id, $s/name, $e/crs}<
for $S in doc("prac5a.xml")/enrolment
return
<enrolment>{
for $s in//student, $e in//enrol
return
if($s/id = $e/stud) then
<student>{$s/id, $s/name, $e/crs}</student>
else <student>{$s/id, $s/name}</student>
}</enrolment>
用于文档中的$S(“prac5a.xml”)/注册
返回
{
学生人数为$s,学生人数为$e
返回
如果($s/id=$e/stud),则
{$s/id、$s/name、$e/crs}
else{$s/id,$s/name}
}
从这一点上,我期待着像这样的输出
<enrolment>
<student>
<id>s1</id>
<name>John</name>
<crs>c1</crs>
<crs>c2</crs>
</student>
<student>
<id>s2</id>
<name>Peter</name>
<crs>c2</crs>
<crs>c3</crs>
</student>
<student>
<id>s3</id>
<name>Rob</name>
</student>
s1
约翰
c1
c2
s2
彼得
c2
c3
s3
抢劫
相反,我得到了这个
<?xml version="1.0" encoding="UTF-8"?>
<enrolment>
<student>
<id>s1</id>
<name>John</name>
<crs>c1</crs>
<crs>c2</crs>
</student>
<student>
<id>s1</id>
<name>John</name>
</student>
<student>
<id>s2</id>
<name>Peter</name>
</student>
<student>
<id>s2</id>
<name>Peter</name>
<crs>c2</crs>
<crs>c3</crs>
</student>
<student>
<id>s3</id>
<name>Rob</name>
</student>
<student>
<id>s3</id>
<name>Rob</name>
</student>
</enrolment>
s1
约翰
c1
c2
s1
约翰
s2
彼得
s2
彼得
c2
c3
s3
抢劫
s3
抢劫
为什么呢?或者更重要的是,我想我怎样才能得到期望的结果。如果没有原始数据,我无法提供完整的解决方案,但您的迭代问题是由于您使用
来。。。在FLWOR语句的
子句中。中的多个变量绑定用于。。。in
子句是嵌套循环的简写,本例应说明:
for $x in (1, 2), $y in (3, 4)
return $x || "-" || $y
返回
1-3
1-4
2-3
2-4
你的代码中也有一些拼写错误对于//学生中的$s,//注册中的$e
无效XQuery(或者可能是,但意味着学生中的每个和注册元素fn:collection()
)。假设您打算对$s//student中的$st、$st//enrol中的$e进行之类的更改(具体取决于输入文档的结构),以下更改可以解决您的问题:
for $st in $s//student
let $e := $st//enrol
...
由于您的问题既缺少示例数据,也缺少对您试图实现的目标的描述,因此此答案包括一些猜测
当前查询对所有学生和课程执行叉积,如果学生正在访问课程,则返回学生的新元素和课程,或者只返回学生的新元素。我想你想要的是一份学生名单,以及他们注册的课程。这种查询可能是:
<enrolment>{ (: Wrapper element for all students :)
let $doc := doc("prac5a.xml")/enrolment (: Access the document, see note below :)
for $student in $doc//student (: Loop over all students :)
return <student>{
$student/id,
$student/name,
$doc/enrol[$student/id = stud] (: Find all enrolments of this particular students, implicit loop :)
}</student>
}</enrolment>
{(:所有学生的包装器元素:)
让$doc:=doc(“prac5a.xml”)/注册(:访问文档,请参见下面的注释:)
对于$doc//student中的$student(:循环所有学生:)
返回{
$student/id,
$student/姓名,
$doc/enrol[$student/id=stud](:查找此特定学生的所有注册,隐式循环:)
}
}
我添加了一些关于差异的注释(除了表示完整的变量名:永远不要使用单字母的变量名,使用描述性的变量名是免费的,并且对于较大的代码片段可以减少很多复杂性)。需要注意的一点是打开文档/数据库的位置:您将包装器元素(
)的内容绑定到$S
,但从不使用它;而是从当前上下文开始访问。我显式加载并使用了该文档。原始数据是什么样子的?您的问题既没有输入,也没有描述您实际想要实现的目标。请阅读和阅读。