我想获得一份没有患病病人的医生名单。 (生病意味着在Value
Outcome
和MinVal
以外的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 />
答案 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约定不使用驼峰大小写,而是使用连字符。