使用 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
我想从以下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