为每个组中的所有组成员使用一个计数器

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 &gt; $offset and $count &lt;= $offset + $size">
    <xsl:apply-templates select="." />
</xsl:if>

其中 $count 将包含已呈现的所有项目的计数,理想情况下,如果我可以如何在 for-each 中创建一个类似于 position() 的计数器,但它不会在当前组的每个循环中重新启动( ).

如果我不想按键分组项目,我会这样做:

<xsl:for-each select="entry">
        <xsl:if test="position() &gt; $offset and position() &lt;= $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() &gt; $offset and position() &lt;= $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() 的值)