为什么Xquery在变量上给我一个错误?一世

时间:2015-12-11 00:16:39

标签: xml xquery

我是XML和XQUERY的新手,并且在尝试验证时遇到了很多困难,可能是非常简单的代码。验证器一直告诉我,我有一个未知的函数或表达式,但似乎停在我的变量周围。有人可以帮忙吗?我确信这是一个非常简单的问题,但我一直在撞墙,试图找出我做错了什么。这是XML:

<PurchaseOrders>
  <PurchaseOrder PurchaseOrderNumber="99503" OrderDate="1999-10-20">
    <Address Type="Shipping">
      <Name>Ellen Adams</Name>
    </Address>
    <Address Type="Billing">
      <Name>Tai Yee</Name>
    </Address>
    <Items>
      <Item PartNumber="872-AA">
        <ProductName>Lawnmower</ProductName>
      </Item>
      <Item PartNumber="926-AA">
        <ProductName>Baby Monitor</ProductName>
      </Item>
    </Items>
  </PurchaseOrder>
 </PurchaseOrders>

我的Xquery:

for $x in doc/PurchaseOrders/PurchaseOrder
    let $z := $x/Items/Item
    let$n := count($z)
    where $x/Address[@Type = 'Shipping'] order by $x/Name ascending
    return <Orders><Order><Name>{$x/Name}</Name><NoProducts>$n</NoProducts></Order></Orders>

预期产出:

<Orders>
  <Order>
    <name>Ellen Adams</name>
    <noProducts>2</noProducts>
  </Order>
 </Orders>

我做错了什么?我知道这是基本的,但我很乐意学习!谢谢!

1 个答案:

答案 0 :(得分:0)

我不能说你做错了什么(因为问题中提供的错误不够准确,而且当我自己运行相同的查询时,我收到了空的结果,但也没有错误),但我可以提供一个查询,生成您期望的输出。

declare context item := document {
  <PurchaseOrders>
    <PurchaseOrder PurchaseOrderNumber="99503" OrderDate="1999-10-20">
      <Address Type="Shipping">
        <Name>Ellen Adams</Name>
      </Address>
      <Address Type="Billing">
        <Name>Tai Yee</Name>
      </Address>
      <Items>
        <Item PartNumber="872-AA">
          <ProductName>Lawnmower</ProductName>
        </Item>
        <Item PartNumber="926-AA">
          <ProductName>Baby Monitor</ProductName>
        </Item>
      </Items>
    </PurchaseOrder>
  </PurchaseOrders>
};

<Orders>{
for $purchaseOrder in /PurchaseOrders/PurchaseOrder[Address/@Type='Shipping']
    let $shippingAddress := $purchaseOrder/Address[@Type='Shipping']
    let $items := $purchaseOrder/Items/Item
    let $itemCount := count($items)
    order by $shippingAddress/Name ascending
    return <Order>
             <Name>{$shippingAddress/Name}</Name>
             <PONum>{string($purchaseOrder/@PurchaseOrderNumber)}</PONum>
             <NoProducts>{$itemCount}</NoProducts>
           </Order>
}</Orders>

请注意,之前$x指向采购订单,而此处的密钥是送货地址 - 这很重要,因为否则您的$x/Name找不到数据。