Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 用于if-then-else意外输出的Xquery_Xml_Xquery - Fatal编程技术网

Xml 用于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}<

我试图返回一些输出,但遇到了一些困难,很可能是我对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}</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
,但从不使用它;而是从当前上下文开始访问。我显式加载并使用了该文档。

原始数据是什么样子的?您的问题既没有输入,也没有描述您实际想要实现的目标。请阅读和阅读。