使用XQuery提取数据

时间:2016-01-19 22:34:34

标签: xml xquery let

我想从以下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的返回值,但是它一直给我一个错误。

1 个答案:

答案 0 :(得分:0)

你在这里不需要return。如果outRange()小于true 大于{{1},这是声明Value函数返回布尔值MinVal的一种可能方法然后返回布尔值MaxVal

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()上下文节点作为参数传递。

请参阅演示:http://www.xpathtester.com/xquery/33c21c43cc78e72688dc52e7bfbadd43

输出(注意结尾处的数字 Outcome ):2