XQuery将变量比作数字

时间:2017-12-15 16:32:51

标签: xquery

我想制作一个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'。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

FLWOR表达式在此上下文中没有任何意义:它一次只评估一个itemreturn每个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