我想制作一个XQuery,输出三张CD的价格,减去最便宜CD的价格。我已经生成了一个用户定义的函数sumtwomax(),它接受三个整数参数并产生最大两个数的总和。这在我提供数字时有效。 但是在向FLWOR表达式提供变量时遇到问题。有人可以帮帮我吗?
这是我的XML代码:
<items>
<item>
<code>c002</code>
<price>10</price>
<rating>5</rating>
</item>
<item>
<code>c006</code>
<price>15</price>
<rating>3</rating>
</item>
<item>
<code>c004</code>
<price>12</price>
<rating>3</rating>
</item>
<item>
<code>c001</code>
<price>7</price>
<rating>5</rating>
</item>
<item>
<code>c003</code>
<price>10</price>
<rating>4</rating>
</item>
<item>
<code>c005</code>
<price>8</price>
<rating>4</rating>
</item>
</items>
这是我的XQuery:
declare namespace myfn = "http://www.brookes.ac.uk/P00601/xquery/functions";
declare function myfn:sumtwomax( $first, $sec, $third) { sum(($first, $sec, $third)) - min (($first, $sec, $third))};
for $d in doc("shop.xml") //item
let $price1 := xs:integer($d/price/data()[$d/code="c002"])
let $price2 := xs:integer($d/price/data()[$d/code="c004"])
let $price3 := xs:integer($d/price/data()[$d/code="c006"])
return
myfn:sumtwomax($price1, $price2, $price3)
结果产生'0 0 0',而不是期望的值'15'。有人可以帮忙吗?
答案 0 :(得分:2)
FLWOR表达式在此上下文中没有任何意义:它一次只评估一个item
(return
每个item
一个结果items
}),但是你在该循环中运行的表达式只返回有用的结果,如果他们可以搜索所有项,以便能够填写所有三个变量(而不是只有与该变量关联的变量)当时循环遍历单个项目。)
如果真的希望将其作为FLWOR,请考虑迭代declare function myfn:sumtwomax( $first, $sec, $third) { sum(($first, $sec, $third)) - min (($first, $sec, $third))};
for $d in //items
let $price1 := xs:integer($d/item[code="c002"]/price)
let $price2 := xs:integer($d/item[code="c004"]/price)
let $price3 := xs:integer($d/item[code="c006"]/price)
return myfn:sumtwomax($price1, $price2, $price3)
个元素(其中只有一个元素):
for
...或者,完全删除不必要的declare function myfn:sumtwomax( $first, $sec, $third) { sum(($first, $sec, $third)) - min (($first, $sec, $third))};
let $price1 := xs:integer(//item[code="c002"]/price)
let $price2 := xs:integer(//item[code="c004"]/price)
let $price3 := xs:integer(//item[code="c006"]/price)
return myfn:sumtwomax($price1, $price2, $price3)
:
div