pagination in xsl

筅森魡賤 提交于 2019-12-01 11:02:45

I. Here is a small example showing how to implement "paging"

Given this source XML document:

<nums>
  <num>01</num>
  <num>02</num>
  <num>03</num>
  <num>04</num>
  <num>05</num>
  <num>06</num>
  <num>07</num>
  <num>08</num>
  <num>09</num>
  <num>10</num>
</nums>

and given a pagesize of 3, this XSLT 1.0 transformation:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*" name="identity">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="num[position() mod 3 = 1]">
  <page>
    <xsl:apply-templates mode="inGroup"
      select=".|following-sibling::num[not(position()>2)]"/>
  </page>
 </xsl:template>

 <xsl:template match="num"/>

 <xsl:template match="num" mode="inGroup">
  <xsl:call-template name="identity"/>
 </xsl:template>
</xsl:stylesheet>

produces:

<nums>
   <page>
      <num>01</num>
      <num>02</num>
      <num>03</num>
   </page>
   <page>
      <num>04</num>
      <num>05</num>
      <num>06</num>
   </page>
   <page>
      <num>07</num>
      <num>08</num>
      <num>09</num>
   </page>
   <page>
      <num>10</num>
   </page>
</nums>

Do note:

It isn't possible by only using pure XSLT 1.0 to produce more than one result document by a single transformation.

You can either use XSLT 2.0 and its xsl:result-document instruction, or an XSLT 1.0 processor that implements EXSLT's <exsl:document> extension element. Another alternative is to initiate a separate XSLT 1.0 transformation for every output page.


II. Paging with XSLT 2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pPageSize" select="3"/>

 <xsl:template match="/*">
  <xsl:for-each-group select="num" group-adjacent="position() idiv $pPageSize">
     <xsl:result-document href="file:///c:/temp/delete/page{current-grouping-key()+1}">
      <html>
        <xsl:apply-templates mode="inGroup" select="current-group()"/>
      </html>
     </xsl:result-document>
    </xsl:for-each-group>
 </xsl:template>

 <xsl:template match="num" mode="inGroup">
  <p><xsl:value-of select="."/></p>
 </xsl:template>
</xsl:stylesheet>

When this transformation is applied on the same XML document (above). it successfully creates four result documents.

And Saxon 8.7.01 issues this:

Saxon 9.1.0.7J from Saxonica

Java version 1.6.0_17

Stylesheet compilation time: 223 milliseconds

Processing file:/C:\CVS-DDN\fxsl-xslt2\data\numList.xml

Building tree for file:/C:\CVS-DDN\fxsl-xslt2\data\numList.xml using class net.sf.saxon.tinytree.TinyBuilder

Tree built in 2 milliseconds

Tree size: 23 nodes, 20 characters, 0 attributes

Loading net.sf.saxon.event.MessageEmitter

Writing to file:/c:/temp/delete/page1

Writing to file:/c:/temp/delete/page2

Writing to file:/c:/temp/delete/page3

Writing to file:/c:/temp/delete/page4

Execution time: 73 milliseconds

Memory used: 21482856

NamePool contents: 21 entries in 20 chains. 6 prefixes, 7 URIs
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!