正如标题所说,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
的循环,并在order
和id
匹配时返回值,但调用$a/color/text()
将返回所有color
具有相同<id>
兄弟值的元素,这不是我想要的
答案 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来模拟组。但这在很大程度上取决于具体的用例。