为for-each-groups中的所有组成员使用计数器

时间:2015-03-12 08:18:37

标签: xml xslt xslt-2.0

我有一个问题,我有一个xml内容,不同的密钥需要组合在一起显示,当显示有一个分页,所以我不能在同一页面上显示所有条目,我正在使用每个-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

Page2:

 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个项目,如何获取当前分组的前面条目数()

编辑以获取更多信息:

我有一个变量$ size和$ offsite,我基本上想要做的是:

<xsl:if test="$count &gt; $offset and $count &lt;= $offset + $size">
    <xsl:apply-templates select="." />
</xsl:if>

其中$ count将包含已经呈现的所有项的计数,理想情况下,如果我可以创建一个类似于position()in-each的计数器,但它不会随current-group()的每个循环重新启动。

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

<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,并且每个组的条目都是单独循环的,所以如何跟踪已经从前面的组渲染的条目。

1 个答案:

答案 0 :(得分:2)

你可以分两个阶段完成 - 首先重新排序整个未填充的条目列表,使它们按键组合在一起(即按照最终输出所需的顺序),然​​后取适当的页面“切片”顺序进行实际转换:

<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>

即使分页符分组通过某个组,这也可以正常工作,例如如果您的示例输入生成<{p>,则$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()的值)