xsl中的分页

时间:2012-09-02 10:07:58

标签: xslt pagination xslt-1.0

我有一个xml文件,还有一个xsl文件,我为它编写了生成html的文件。我的xml文件是:

<?xml version="1.0" encoding="UTF-8"?>
<expert_questions>
    <question Id="10">
        <source_ip>192.168.150.1</source_ip>
        <port>545</port>
        <packet_size>1400</packet_size>
        <more_details>
            <time>13:42</time>
            <count>100</count>
            <comment>more details</comment>
        </more_details>
    </question>
    <question Id="...">
       .
       .
       .
    </question>
</expert_questions>

和我的xsl文件:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                    version="1.0">
        <xsl:output omit-xml-declaration="yes" indent="yes" />
        <xsl:template match="/">
            <xsl:for-each select="expert_questions">
                <table border="1" cellspacing="0" cellpadding="0">
                    <tr class ="table-title">
                        <th class="th">source ip</th>
                        <th class="th">port</th>
                        <th class="th">packet size</th>
                        <th class="th">more details</th>
                    </tr>
                    <xsl:for-each select="question">
                        <tr>
                            <xsl:attribute name="id">
                                <xsl:value-of select="@Id" />
                            </xsl:attribute>

                            <td><xsl:value-of select="source_ip"></xsl:value-of></td> 
                            <td><xsl:value-of select="port"></xsl:value-of></td>
                            <td><xsl:value-of select="packet_size"></xsl:value-of></td>
                            <td>   
                                <xsl:for-each select="more_details">
                                        <xsl:attribute name="title">

                                            <xsl:value-of select="concat('Time: ', time, '&#10;')" />
                                            <xsl:value-of select="concat('Count: ', count)" />
                                            <xsl:value-of select="concat('Comment: ', comment)" />
                                        </xsl:attribute>
                                        <xsl:text>more details</xsl:text>
                                    </a>
                                </xsl:for-each>
                            </td>
                        </tr>
                    </xsl:for-each>
                </table>
            </xsl:for-each>
        </xsl:template>

    </xsl:stylesheet>

xml中的信息太长,应该显示在某些页面中。

我需要使用分页。我搜索了I find this page(关于 Xslt分页示例)以帮助我这样做。

它没有任何xml文件,我无法完全理解该怎么做(我是xsl的新手)。

我可以不用umbraco这样做吗?

1 个答案:

答案 0 :(得分:5)

<强>予。这是一个小例子,展示了如何实现“分页”

鉴于此源XML文档:

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

并且给出了3的页面大小,这个XSLT 1.0转换

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

<强>产生

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

请注意

仅使用纯XSLT 1.0通过单个转换生成多个结果文档是不可能的。

您可以使用XSLT 2.0及其xsl:result-document指令,也可以使用实现EXSLT <exsl:document>扩展元素的XSLT 1.0处理器。另一种方法是为每个输出页面启动单独的XSLT 1.0转换。


<强> II。使用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>

将此转换应用于同一XML文档(上图)时。它成功创建了四个结果文档

Saxon 8.7.01发布了这个:

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