XQuery 1.0不打印我所期望的 - 错误使用FLWR

时间:2016-01-25 09:30:54

标签: xml xquery

我想获得一份没有患病病人的医生名单。 (生病意味着在Value OutcomeMinVal以外的MaxVal中至少有一个$doc-ill

我已经知道该值打印了两次,因为Stack Overflow医生进行了两次考试。

此外,在Doctor中,只有Exam Outcome的第一个$doc-ill超出范围。相反,我想要做的是将Outcome所有医生放入至少一个declare function local:outRange($x as element()) as xs:boolean{ boolean( $x/Value < $x/MinVal or $x/Value > $x/MaxVal ) }; (: List of all doctors :) let $alldoc := distinct-values(//Exam/Doctor) (: List of doctors with at least 1 ill patient :) for $exam in //Exam let $doc-ill := $exam/Doctor where some $outc in $exam/Outcome satisfies local:outRange($outc) return ( (: List of doctors without hill patients :) let $ok := ( for $doc in $alldoc return if( some $doc2 in $doc-ill satisfies $doc2 = $doc) then () else( $doc ) ) return <HealthyDoctors> { $ok }</HealthyDoctors> ) 范围之外。

有人可以突出我的错误吗?

<Exam>
    <Outcome>
      <Value>90</Value>
      <MinVal>100</MinVal>
      <MaxVal>150</MaxVal>
    </Outcome>
    <Outcome>
      <Value>15</Value>
      <MinVal>1</MinVal>
      <MaxVal>20</MaxVal>
    </Outcome>
    <Outcome>
      <Value>1</Value>
      <MinVal>1</MinVal>
      <MaxVal>5</MaxVal>
    </Outcome>
    <Doctor>Stack Overflow</Doctor>
   </Exam>
  <Exam>
    <Outcome>
      <Value>190</Value>
      <MinVal>100</MinVal>
      <MaxVal>150</MaxVal>
    </Outcome>
    <Outcome>
      <Value>10</Value>
      <MinVal>1</MinVal>
      <MaxVal>5</MaxVal>
    </Outcome>
    <Doctor>Stack Overflow</Doctor>
   </Exam>
  <Exam>
    <Outcome>
      <Value>120</Value>
      <MinVal>100</MinVal>
      <MaxVal>150</MaxVal>
    </Outcome>
    <Outcome>
      <Value>4</Value>
      <MinVal>1</MinVal>
      <MaxVal>5</MaxVal>
    </Outcome>
    <Doctor>Health</Doctor>
   </Exam>
  <Exam>
    <Outcome>
      <Value>120</Value>
      <MinVal>100</MinVal>
      <MaxVal>150</MaxVal>
    </Outcome>
    <Outcome>
      <Value>10</Value>
      <MinVal>1</MinVal>
      <MaxVal>5</MaxVal>
    </Outcome>
    <Doctor>OneIll</Doctor>
   </Exam>

一小部分XML就是这样:

<HealthyDoctors>
<Doctor>Health</Doctor>
</HealthyDoctors>

我期待的结果是:

<input type="tel" data-tel-msg="Invalid Phone Number!" class="k-textbox" pattern="^\d{3}-\d{3}-\d{4}$" required />

1 个答案:

答案 0 :(得分:1)

我不确定“山区病人”是什么,但是从您的代码中猜测我会说它是Outcome元素,其值超出最小值或最大值。

我不确定您的整个代码,因为它对您想要实现的结果非常复杂。首先,你试图让所有医生与一名山区患者一起,然后你似乎想要得到整套医生和一名山区病人的医生,以获得你的实际结果。但实际上,如果没有一个小山病人,只需让所有医生都没有所有的重新指示就更简单了:

declare function local:in-range($x as element(Outcome)) as xs:boolean{
  xs:int($x/Value) >= xs:int($x/MinVal) and xs:int($x/Value) <= xs:int($x/MaxVal)
};

<HealthyDoctors> {
  for $doc in distinct-values(//Exam/Doctor)
  where every $outcome in //Exam[Doctor = $doc]/Outcome satisfies local:in-range($outcome)
  return <Doctor>{ $doc }</Doctor>
}</HealthyDoctors>

所以这段代码基本上说给我每个医生,他/她被分配的每个Outcome元素满足所有范围要求。您的outRange函数无法正常工作是因为值被比较为字符串(即"9" > "10"),因此您必须将它们显式地转换为int。

此外,我将您的函数重命名为in-range,因为XQuery约定不使用驼峰大小写,而是使用连字符。