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

Xml 为什么Xquery在变量上给我一个错误?我,xml,xquery,Xml,Xquery,我对XML和XQUERY非常陌生,在尝试验证可能非常简单的代码时遇到了麻烦。验证器一直告诉我,我有一个未知的函数或表达式,但似乎停止了我的变量。有人能帮忙吗?我相信这是一个非常简单的问题,但我一直在努力找出我做错了什么。以下是XML: <PurchaseOrders> <PurchaseOrder PurchaseOrderNumber="99503" OrderDate="1999-10-20"> <Address Type="Shipping">

我对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>
用于单据/采购订单/采购订单中的$x
设$z:=$x/项/项
让$n:=计数($z)
其中$x/Address[@Type='Shipping']按$x/Name升序订购
返回{$x/Name}$n
预期产出:

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

艾伦·亚当斯
2.

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

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

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>
声明上下文项:=文档{
艾伦·亚当斯
大仪
割草机
婴儿监视器
};
{
对于/PurchaseOrders/purchaseOrder[地址/@Type='Shipping']中的$purchaseOrder
let$shippingAddress:=$purchaseOrder/地址[@Type='Shipping']
让$items:=$purchaseOrder/项目/项目
让$itemCount:=计数($items)
按$shippingAddress/Name升序订购
返回
{$shippingAddress/Name}
{string($purchaseOrder/@PurchaseOrderNumber)}
{$itemCount}
}

请注意,以前的
$x
指向采购订单,这里的键是发货地址——这很重要,因为在其他情况下,
$x/Name
找不到数据。

$x
是采购订单。它没有名称,因此,
$x/Name
是空的。顺便说一句,我强烈建议您使用您正在测试的特定引擎标记您的问题,并(在某处)提及它支持的XQuery语言版本;我的答案是针对XQuery 3.0 engine BaseX.BTW进行测试的,今后,请准确引用您给出的错误,而不是转述。谢谢您,Charles!我以为是我的变量把我甩了,但我想不是。我在用BaseX进行测试。我也没有解释我的错误,那正是他们给我的错误。你知道我如何在块中输出@PurchaseOrderNumber吗?每次我尝试输出时,它都会给我所有的发货和账单地址信息。我需要另一个表达方式吗?你能告诉我你在尝试什么吗(那会释放多余的信息)?