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