xquery帮助从不同的元素节点查询产品和用户

xquery帮助从不同的元素节点查询产品和用户,xquery,Xquery,请帮助我理解如何使用xquery编写这种查询。 我有一个.xml: <auctions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <products> <product id="1"> <name>Name1</name> </product> <product id="2"> <name>Name2

请帮助我理解如何使用xquery编写这种查询。 我有一个.xml:

<auctions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <products>
  <product id="1">
     <name>Name1</name>
  </product>
  <product id="2">
     <name>Name2</name>
  </product>
  <product id="3">
     <name>Name3</name>
  </product>
  <product id="4">
     <name>Name4</name>
  </product>
</products>
  <users>
<user username="Kukuk1">
</user>
<user username="Kukuk2">
</user>
<user username="Kukuk3">
  </user>
</users>
<bids>
  <product id="1">
    <bid user="Kukuk1">400</bid>
    <bid user="Kukuk2">410</bid>
    <bid user="Kukuk1">450</bid>
  </product>
  <product id="2">
    <bid user="Kukuk3">200</bid>
    <bid user="Kukuk2">300</bid>
  </product>
  <product id="3">
    <bid user="Kukuk1">150</bid>
  </product>
</bids>
</auctions>

名称1
姓名2
名字3
名字4
400
410
450
200
300
150
我需要得到这个输出,如下所示:用户“Kukuk1”得到了产品“Name1”(值为“450”)和“Name3”(值为“150”)。用户“kuk3”没有赢得任何产品。用户“kuk2”赢得了产品“Name2”

元素应按用户升序排列,元素乘积按值降序排列,如下所示:

 <got>
  <user name="Kukuk1">
    <product value="450">Name1</product>
    <product value="150">Name3</product>
  </user>
  <user name="Kukuk3"/>
  <user name="Kukuk2">
    <product value="300">Name2</product>
  </user>
 </got>
<got>{
  for $u in //auctions/users/user
  let $username := $u/@username
  order by $username
  return element user {
    $username,
    for $product in //auctions/bids/product[bid/@user = $username]
    let $highest-bid := max($product/bid)
    order by $highest-bid descending
    return
      if ($product/bid[. = $highest-bid and @user = $username])
      then element product {
        attribute {"value"} {$highest-bid},
        //auctions/products/product[@id = $product/@id]/name/string()
      } else ()
  }
}</got>

名称1
名字3
姓名2
到目前为止,我得到的是:

declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";
declare option output:item-separator "&#xa;";
 <got>&#xa;{
  for $u in (//auctions/users/user)
   let $p:= //auctions/products
   let $v := //auctions/bids/product
   let $max1 := max($v/bid)
   let $max2 := max($v/bid[4])
   let $got := //auctions/bids/product
   let $won-product := $got[@id=$p/product/@id]
   order by $u
   return 
      if ($u/@username="Kukuk1") then
              (<user name="{fn:string($u/@username)}"> 
&#xa;<product value="{$max1}">{fn:string($p/product[1]/name)}</product>
&#xa;</user>,'&#xa;')
        else
            if 
            ($u/@username="Kukuk3") then
                (<user name="{fn:string($u/@username)}"> &#xa;<product value="{$max2}">{fn:string($p/product[2]/name)}</product>&#xa;</user>,'&#xa;')
            else
                if
                    ($u/@username="Kukuk2") then
                        (<user name="{fn:string($u/@username)}">
 &#xa;<product value="{$max2}">{fn:string($p/product[3]/name)}</product>&#xa;
 </user>,'&#xa;')
                else ()

}
</got>
声明命名空间输出=”http://www.w3.org/2010/xslt-xquery-serialization";
声明选项输出:项目分隔符“
;";

{
对于(//auctions/users/user)中的$u
let$p:=//拍卖/产品
let$v:=//拍卖/出价/产品
设$max1:=max($v/标)
设$max2:=max($v/bid[4])
let$got:=//拍卖/出价/产品
让$WIND product:=$got[@id=$p/product/@id]
以美元订购
返回
如果($u/@username=“Kukuk1”),则
( 

;{fn:string($p/product[1]/name)}

;,'和#xa;')
其他的
如果
($u/@username=“Kukuk3”)然后
(
;{fn:string($p/product[2]/name)}
;,'
;'))
其他的
如果
($u/@username=“Kukuk2”)然后
(

;{fn:string($p/product[3]/name)}
;
,“
;”)
else()
}
我得到了这个输出:

<got>
 <user name="Kukuk1"> 
  <product value="450">Name1</product>
 </user>
 <user name="Kukuk3"> 
  <product value="">Name2</product>
 </user>
 <user name="Kukuk2"> 
  <product value="">Name3</product>
 </user>
</got>

名称1
姓名2
名字3

您需要两个for循环来实现您描述的结果。在外部循环中,您将根据用户各自的用户名对用户进行排序,在内部循环中,您将获得出价并按其最高值排序

因此,它应该是这样的:

 <got>
  <user name="Kukuk1">
    <product value="450">Name1</product>
    <product value="150">Name3</product>
  </user>
  <user name="Kukuk3"/>
  <user name="Kukuk2">
    <product value="300">Name2</product>
  </user>
 </got>
<got>{
  for $u in //auctions/users/user
  let $username := $u/@username
  order by $username
  return element user {
    $username,
    for $product in //auctions/bids/product[bid/@user = $username]
    let $highest-bid := max($product/bid)
    order by $highest-bid descending
    return
      if ($product/bid[. = $highest-bid and @user = $username])
      then element product {
        attribute {"value"} {$highest-bid},
        //auctions/products/product[@id = $product/@id]/name/string()
      } else ()
  }
}</got>
{
在//拍卖/用户/用户中购买$u
让$username:=$u/@username
按$username订购
返回元素用户{
$username,
对于//auctions/bids/product[bid/@user=$username]中的$product
let$最高出价:=最大($产品/出价)
按最高出价降价$
返回
如果($product/bid[.=$highest bid和@user=$username])
然后是元素积{
属性{“值”}{$highest bid},
//拍卖/产品/产品[@id=$product/@id]/name/string()
}else()
}
}

请注意,您的示例输出不符合您的描述,即
Kukuk3>Kukuk2
,因此应该按这种方式排序。我假设您的描述是正确的。

您需要两个for循环来实现您描述的结果。在外循环中,您将根据用户各自的用户名和inne对用户进行排序r循环您将获得出价并按其最高值排序

因此,它应该是这样的:

 <got>
  <user name="Kukuk1">
    <product value="450">Name1</product>
    <product value="150">Name3</product>
  </user>
  <user name="Kukuk3"/>
  <user name="Kukuk2">
    <product value="300">Name2</product>
  </user>
 </got>
<got>{
  for $u in //auctions/users/user
  let $username := $u/@username
  order by $username
  return element user {
    $username,
    for $product in //auctions/bids/product[bid/@user = $username]
    let $highest-bid := max($product/bid)
    order by $highest-bid descending
    return
      if ($product/bid[. = $highest-bid and @user = $username])
      then element product {
        attribute {"value"} {$highest-bid},
        //auctions/products/product[@id = $product/@id]/name/string()
      } else ()
  }
}</got>
{
在//拍卖/用户/用户中购买$u
让$username:=$u/@username
按$username订购
返回元素用户{
$username,
对于//auctions/bids/product[bid/@user=$username]中的$product
let$最高出价:=最大($产品/出价)
按最高出价降价$
返回
如果($product/bid[.=$highest bid和@user=$username])
然后是元素积{
属性{“值”}{$highest bid},
//拍卖/产品/产品[@id=$product/@id]/name/string()
}else()
}
}

请注意,您的示例输出不符合您的描述,因为
Kukuk3>Kukuk2
,因此应该按这种方式订购。我假设您的描述是正确的。

非常感谢,这是一个很大的帮助。Kukuk3有一个有效的出价,但没有得到产品,因为他/她的出价是200,而kuk2的出价是300:)-当然有换行符,我怎么才能得到这个输出呢?:Name1 Name3 Name2@xaoC啊,我明白-这没有包括在你原来的帖子中。我相应地更新了我的查询。但是,我仍然不明白为什么Kuku3应该在Kukuk2之前输出-如果你想订购的话此外,关于您更新的问题,我不得不说我不理解您的查询或您想要实现的目标-它似乎非常适合这个小数据集,如果没有针对特定用户名的
if
,那么做得更一般不是更有意义吗关于小数据集,我说得对。我只是一个初学者,想学习xquery。我的名字不好-他们应该是这样理解的。Akuk=Kukuk1,Ckuk=Kukuk2,Bkuk=kukukuk3。非常感谢,这是一个很大的帮助。kukuku3有一个有效的出价,但没有得到产品,因为他/她的出价是200,而kukukuk2的出价是300:)-如何我得到这个输出了吗,当然有换行符吗?:Name1 Name3 Name2@xaoC啊,我明白-这没有包括在你原来的帖子中。我相应地更新了我的查询。但是,我仍然不明白为什么Kuku3应该在Kukuk2之前输出-如果你想基于这样的原因订购的话除了名称之外,您可能还想指定它。另外,关于您更新的问题,我不得不说我不理解您的查询或您想要实现什么-它似乎非常适合于这个小数据集,如果没有针对特定用户名的
if
,那么做得更一般不是更有意义吗?是的,您是对的关于小数据集。我只是一个初学者,想学习xquery。我的名字不好——它们应该是这样理解的。Akuk=Kukuk1,Ckuk=Kukuk2,Bkuk=Kukuk3。