在XQuery中是否存在xsl:for-each-groups等价物?

时间:2014-05-21 12:47:20

标签: xml xslt xpath xquery

正如标题所说,XQuery中是否存在xsl:for-each-groups等价物?

我要做的是获取一个元素子树,更改数据结构并迭代xml。

例如

clients.xml

<clients>
  <client>
  <fname>Sam</fname>
  <order>6789</order>
  </client>
</client>

products.xml

<products>
  <product>
    <id>6789</id>
    <name>shirt</name>
    <color>red</color>
  </product>
  <product>
    <id>6789</id>
    <name>shirt</name>
    <color>blue</color>
  </product>
  <product>
    <id>6789</id>
    <name>pants</name>
    <color>black</color>
  </product>
</products>

所以我可能想要显示一个输出.xml,其中包含Sam作为名称,并详细说明了他订购的产品。 (代码只是一个例子,完整的东西中会有多个不同的产品和客户端)

更新

我目前拥有的是循环遍历product的循环,并在orderid匹配时返回值,但调用$a/color/text()将返回所有color具有相同<id>兄弟值的元素,这不是我想要的

1 个答案:

答案 0 :(得分:4)

使用XQuery 3.0,有。它引入了group by语句,该语句按特定元素分组。

在您的示例示例中,您可能希望按产品ID进行分组,例如:

for $product in /products/product
let $id := $product/id
group by $id
return $product

在XQuery中,for each总是可以使用for循环(flowr表达式)来实现。但是还有一个新引入的fn:for-each函数可能会让您感兴趣。对于作为第一个参数给出的序列中的每个元素,它将应用某个函数(作为第二个参数给出)。所以例如你可以这样做:

for-each(/products/product, function($product) { local:doSomethingWithProduct($product) })

值得注意的是,您希望在示例中实现的内容也可以使用简单的XPath 1.0表达式实现。您将使用

获得与一个ID相关联的所有产品
/products/product[@id = /client/client[@name = "Sam"]/order]

最有可能的方法是使用纯XQuery 1.0来模拟组。但这在很大程度上取决于具体的用例。