为每个组中的所有组成员使用一个计数器
using a counter for all groups members in for-each-group
我有一个问题,我有一个 xml 具有不同键的内容需要组合在一起并显示,当显示时有分页所以我无法在同一页面上显示所有条目,我我正在使用 for-each-group 对项目进行分组,并循环遍历每个 current-group() 并显示其项目,xml 是这样的:
<entry>
<key>key1</key>
<value>value1</value>
</entry>
<entry>
<key>key2</key>
<value>value2</value>
</entry>
<entry>
<key>key1</key>
<value>value3</value>
</entry>
<entry>
<key>key1</key>
<value>value4</value>
</entry>
<entry>
<key>key3</key>
<value>value5</value>
</entry>
<entry>
<key>key2</key>
<value>value6</value>
</entry>
<entry>
<key>key4</key>
<value>value7</value>
</entry>
<entry>
<key>key3</key>
<value>value8</value>
</entry>
<entry>
<key>key5</key>
<value>value9</value>
</entry>
<entry>
<key>key1</key>
<value>value10</value>
</entry>
<entry>
<key>key2</key>
<value>value11</value>
</entry>
应该显示为:
第1页:
key1
value1
value3
value4
value10
key2
value2
value6
value11
key3
value5
value8
key4
value7
第 2 页:
key5
value9
我使用的没有分页的 xsl 是
<xsl:for-each-group select="entry" group-by="key">
<xsl:value-of select="current-grouping-key()"/>
<xsl:for-each select="current-grouping()">
<xsl:apply-templates select="." />
</xsl:for-each>
</xsl:for-each-group>
我需要在每页只显示10个条目,如何获取current-grouping()的前面条目数
编辑以获取更多信息:
我有一个变量 $size 和 $offsite,我基本上想做的是:
<xsl:if test="$count > $offset and $count <= $offset + $size">
<xsl:apply-templates select="." />
</xsl:if>
其中 $count 将包含已呈现的所有项目的计数,理想情况下,如果我可以如何在 for-each 中创建一个类似于 position() 的计数器,但它不会在当前组的每个循环中重新启动( ).
如果我不想按键分组项目,我会这样做:
<xsl:for-each select="entry">
<xsl:if test="position() > $offset and position() <= $offset + $size">
<xsl:apply-templates select="." />
</xsl:if>
</xsl:for-each>
但现在因为我正在使用 for-each-group,并且每个组的条目都是单独循环的,我如何才能跟踪已经从前面的组呈现的条目。
您可以分两个阶段进行 - 首先重新排序整个未分页的条目列表,以便将它们按键组合在一起(即按照最终输出要求的顺序),然后选择适当的页面 "slice" 的序列进行实际转换:
<xsl:variable name="orderedEntries" as="element()*">
<xsl:for-each-group select="entry" group-by="key">
<xsl:sequence select="current-group()" />
</xsl:for-each-group>
</xsl:variable>
<xsl:for-each-group select="$orderedEntries[
position() > $offset and position() <= $offset + $size]"
group-by="key">
<xsl:value-of select="current-grouping-key()"/>
<xsl:for-each select="current-group()">
<xsl:apply-templates select="." />
</xsl:for-each>
</xsl:for-each-group>
即使分页符在一个组的中途,这也会起作用,例如$offset
和 $size
的 5 给定您的示例输入将产生
key2
value6
value11
key3
value5
value8
key4
value7
P.S。正如马丁在评论中指出的那样,
<xsl:for-each select="current-group()">
<xsl:apply-templates select="." />
</xsl:for-each>
在大多数情况下等同于
<xsl:apply-templates select="current-group()"/>
(唯一的区别在于被调用模板将看到的 position()
和 last()
的值)
我有一个问题,我有一个 xml 具有不同键的内容需要组合在一起并显示,当显示时有分页所以我无法在同一页面上显示所有条目,我我正在使用 for-each-group 对项目进行分组,并循环遍历每个 current-group() 并显示其项目,xml 是这样的:
<entry>
<key>key1</key>
<value>value1</value>
</entry>
<entry>
<key>key2</key>
<value>value2</value>
</entry>
<entry>
<key>key1</key>
<value>value3</value>
</entry>
<entry>
<key>key1</key>
<value>value4</value>
</entry>
<entry>
<key>key3</key>
<value>value5</value>
</entry>
<entry>
<key>key2</key>
<value>value6</value>
</entry>
<entry>
<key>key4</key>
<value>value7</value>
</entry>
<entry>
<key>key3</key>
<value>value8</value>
</entry>
<entry>
<key>key5</key>
<value>value9</value>
</entry>
<entry>
<key>key1</key>
<value>value10</value>
</entry>
<entry>
<key>key2</key>
<value>value11</value>
</entry>
应该显示为:
第1页:
key1
value1
value3
value4
value10
key2
value2
value6
value11
key3
value5
value8
key4
value7
第 2 页:
key5
value9
我使用的没有分页的 xsl 是
<xsl:for-each-group select="entry" group-by="key">
<xsl:value-of select="current-grouping-key()"/>
<xsl:for-each select="current-grouping()">
<xsl:apply-templates select="." />
</xsl:for-each>
</xsl:for-each-group>
我需要在每页只显示10个条目,如何获取current-grouping()的前面条目数
编辑以获取更多信息:
我有一个变量 $size 和 $offsite,我基本上想做的是:
<xsl:if test="$count > $offset and $count <= $offset + $size">
<xsl:apply-templates select="." />
</xsl:if>
其中 $count 将包含已呈现的所有项目的计数,理想情况下,如果我可以如何在 for-each 中创建一个类似于 position() 的计数器,但它不会在当前组的每个循环中重新启动( ).
如果我不想按键分组项目,我会这样做:
<xsl:for-each select="entry">
<xsl:if test="position() > $offset and position() <= $offset + $size">
<xsl:apply-templates select="." />
</xsl:if>
</xsl:for-each>
但现在因为我正在使用 for-each-group,并且每个组的条目都是单独循环的,我如何才能跟踪已经从前面的组呈现的条目。
您可以分两个阶段进行 - 首先重新排序整个未分页的条目列表,以便将它们按键组合在一起(即按照最终输出要求的顺序),然后选择适当的页面 "slice" 的序列进行实际转换:
<xsl:variable name="orderedEntries" as="element()*">
<xsl:for-each-group select="entry" group-by="key">
<xsl:sequence select="current-group()" />
</xsl:for-each-group>
</xsl:variable>
<xsl:for-each-group select="$orderedEntries[
position() > $offset and position() <= $offset + $size]"
group-by="key">
<xsl:value-of select="current-grouping-key()"/>
<xsl:for-each select="current-group()">
<xsl:apply-templates select="." />
</xsl:for-each>
</xsl:for-each-group>
即使分页符在一个组的中途,这也会起作用,例如$offset
和 $size
的 5 给定您的示例输入将产生
key2
value6
value11
key3
value5
value8
key4
value7
P.S。正如马丁在评论中指出的那样,
<xsl:for-each select="current-group()">
<xsl:apply-templates select="." />
</xsl:for-each>
在大多数情况下等同于
<xsl:apply-templates select="current-group()"/>
(唯一的区别在于被调用模板将看到的 position()
和 last()
的值)