4

所以我有这样的输入:

<Root>
 <Item id="1" group="foo" />
 <Item id="2" group="bar" />
 <Item id="3" />
</Root>

还有一个模板指令,如:

<xsl:for-each-group select="Root" group-by="@group" />

看来我只能得到foo和的组bar。(为什么?我预计我可能会得到第三组current-group-key() = '')。

我真的很想要第三组。我有什么选择?

谢谢,大卫。

4

2 回答 2

3

马丁给出了很好的解释。

如果您想要什么是允许的,那么根本没有group属性的元素将与具有属性的元素在同一个组中group=''——这并不精确。

最简单的解决方案是在group-by属性中指明属性是否group存在并不重要

最简单的方法是:

<xsl:for-each-group select="Root/*" group-by="string(@group)">

这是一个完整的转换

<xsl:stylesheet version="2.0"   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>

 <xsl:template match="/">
  <xsl:for-each-group select="Root/*" group-by="string(@group)">
   "<xsl:sequence select="string(@group)"/>"
  </xsl:for-each-group>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时:

<Root>
    <Item id="1" group="foo" />
    <Item id="2" group="bar" />
    <Item id="3" />
</Root>

产生了想要的结果

   "foo"

   "bar"

   ""
于 2012-10-28T14:32:01.423 回答
1

XSLT 2.0 规范http://www.w3.org/TR/xslt20/#xsl-for-each-group说以下关于group-by

如果存在 group-by 属性,则按总体顺序检查总体中的项目。对于每个项目 J,对 group-by 属性中的表达式求值以产生零个或多个分组键值的序列。对于这些分组键中的每一个,如果已经创建了一个组来保存具有该分组键值的项目,则将 J 添加到该组中;否则为具有该分组键值的项目创建一个新组,并且 J 成为其第一个成员。

因此,可以将总体中的一个项目分配给零个、一个或多个组。

因此,在您的情况下,当针对第三个元素评估group-by表达式时,它会评估为空序列,因此没有找到分组键导致该项目被添加到任何组中。这样,第三个不属于任何组。@groupItemItem

于 2012-10-28T10:24:44.330 回答