如标题所述,XQuery中是否有一个xsl:for-each-group等效项?
我正在尝试做的是获取元素的子树,更改数据结构并像这样通过xml进行迭代。
例如
client.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>
因此,我可能想显示一个包含.Sam作为名称的输出.xml,其中包含有关他订购的产品的详细信息。 (代码仅是示例,整个产品中将有多个不同的产品和客户)
更新:
我目前拥有的for循环遍历
product
并在order
和id
匹配时返回值,但是调用$a/color/text()
将返回具有相同color
兄弟值的所有<id>
元素,即不是我想要的
最佳答案
使用XQuery 3.0,有。它引入了group by语句,该语句按特定元素分组。
在您的示例示例中,您可能希望按产品ID进行分组,例如:
for $product in /products/product
let $id := $product/id
group by $id
return $product
在XQuery中,始终可以使用for循环(flowr表达式)来实现for each。但是,还有一个新引入的
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模拟组。但这在很大程度上取决于具体的用例。
关于xml - XQuery中是否有一个xsl:for-each-group等效项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23783638/