我有一个问题,我有一个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 > $offset and $count <= $offset + $size">
<xsl:apply-templates select="." />
</xsl:if>
其中$ count将包含已经呈现的所有项的计数,理想情况下,如果我可以创建一个类似于position()in-each的计数器,但它不会随current-group()的每个循环重新启动。
如果我不想按键分组项目,我会做这样的事情:
<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,并且每个组的条目都是单独循环的,所以如何跟踪已经从前面的组渲染的条目。
答案 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() > $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>
即使分页符分组通过某个组,这也可以正常工作,例如如果您的示例输入生成<{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()
的值)