pagination in xsl

前端 未结 1 1583
北荒
北荒 2021-01-15 17:02

I have an xml file and also an xsl file which I wrote for it to generate html. my xml file is:




        
相关标签:
1条回答
  • 2021-01-15 17:53

    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
    
    0 讨论(0)
提交回复
热议问题