使用 XQuery 提取数据

Extract data using XQuery

我想从以下xml获得这些信息:

单次检查中超出健康范围的最大数值。 超出健康范围的值 $val 是:$val < MinVal 或 $val > MaxVal

xml如下:

<MedicalCenter>
  <Patient Id="1">
    ...
  </Patient>
  <Exam PatientId="1">
   ...
    <Outcome>
      <Parameter>A</Parameter>
      <Value>90</Value>
      <MinVal>100</MinVal>
      <MaxVal>150</MaxVal>
    </Outcome>
    <Outcome>
      <Parameter>B</Parameter>
      <Value>15</Value>
      <MinVal>1</MinVal>
      <MaxVal>20</MaxVal>
    </Outcome>
    <Outcome>
      <Parameter>C</Parameter>
      <Value>1</Value>
      <MinVal>1</MinVal>
      <MaxVal>5</MaxVal>
    </Outcome>
    <Doctor>Stack Overflow</Doctor>
   </Exam>
   <Patient Id="2">
    ...
  </Patient>
  <Exam PatientId="2">
    ...
    <Outcome>
      <Parameter>A</Parameter>
      <Value>190</Value>
      <MinVal>100</MinVal>
      <MaxVal>150</MaxVal>
    </Outcome>
    <Outcome>
      <Parameter>C</Parameter>
      <Value>10</Value>
      <MinVal>1</MinVal>
      <MaxVal>5</MaxVal>
    </Outcome>
    <Doctor>Stack Overflow</Doctor>
   </Exam>
</MedicalCenter>

我的解决方案如下,但我不断收到以下错误:

declare function local:outRange( $x as element() ) as xs:boolean{
  if( $x/value < MinValue and $x/value > MaxValue )
  then( false )
  else( true )
};

declare function local:numOk( $exam as element()+ ) as xs:integer{
  let $ok := $exam/Outcome
  where local:outRange($ok) = true
  return count($ok)
};

let $res := local:numOk( doc("myXml.xml")//Exam )
return max( $res )

同样,对于这段代码,我还没有找到解决方案。 我真的不知道问题出在哪里。 我还从函数 true, false 中删除了 return 但它一直给我一个错误。

这里不需要return。这是将 outRange() 函数声明为 return 布尔值 true 的一种可能方法,如果 Value 小于 MinVal 大于 MaxVal,并且 return 布尔值 false 否则:

declare function local:outRange( $x as element() ) as xs:boolean{
  boolean($x/Value < $x/MinVal or $x/Value > $x/MaxVal)
};

然后 numOk() 函数可以像这样简化:

declare function local:numOk( $exam as element()+ ) as xs:integer{
  count($exam/Outcome[local:outRange(.)])
};

注意 . 引用当前上下文节点,即 local:outRange(.) 表示调用 outRange() 函数传递当前 Outcome 上下文节点作为参数。


查看演示:http://www.xpathtester.com/xquery/33c21c43cc78e72688dc52e7bfbadd43

输出(注意最后的数字2):<?xml version="1.0" encoding="UTF-8"?>2