如果人口中的项目与“for-each-group”中的“group-by”不匹配,是否可以将其分配给具有空current-group-key()的组?

时间:2012-10-28 02:51:11

标签: xslt-2.0

所以我输入了如下:

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

和模板说明如下:

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

我似乎只会获得foobar的群组。 (为什么?我预计我可能会获得current-group-key() = ''的第3组。

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

感谢, 大卫。

2 个答案:

答案 0 :(得分: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"

   ""

答案 1 :(得分: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元素计算@group表达式Item的情况下,它会计算为空序列,因此找不到分组键,导致该项目为添加到任何组。这样,第三个Item不属于任何组。