xml - XQuery中是否有一个xsl:for-each-group等效项?

标签 xml xslt xpath xquery

如标题所述,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并在orderid匹配时返回值,但是调用$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/

相关文章:

java - 智能理念 | xml验证错误

javascript - foreach循环使用字符串输出XML

java - XML 转换 - 自动化

javascript - 我如何使用 XML 设计样式

xml - Xpath:复杂表达式,包含一些节点,而排除其他节点

python - 如何使用 python selenium find_element_by_xpath 找出上面的关键字

java - 当我单击按钮更改 Activity 时应用程序崩溃

xml - 在 XSLT 转换期间删除 XML 命名空间?

ruby - NOKOGIRI::XML |删除子计数 = 0 的父项

xpath - 在 XPath 中通过属性名称选择多个元素的更好方法