所以我输入了如下:
<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() = ''
的第3组。
我真的很想要第3组。我有什么选择?
感谢, 大卫。
答案 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
不属于任何组。