在xsl中分页 [英] pagination in xsl
问题描述
我有一个xml文件和一个xsl文件,我为此编写了该文件以生成html.我的xml文件是:
I have an xml file and also an xsl file which I wrote for it to generate html. my xml file is:
<?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, ' ')" />
<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中的信息太长,应该在某些页面中显示.
Information in xml are too long, that should be display in some pages.
我需要使用分页.我搜索并找到了此页面(关于 Xslt分页示例)帮助我做到这一点.
I need to use pagination. I searched and I find this page (about Xslt Paging example) to help me do this.
它没有任何xml文件,我无法完全理解该怎么做(我是xsl的新手).
It didn't have any xml files and I can't completely understand what to do (I'm new in xsl).
我可以在没有umbraco的情况下这样做吗?
Can I do this without umbraco or not?
推荐答案
I.这是一个小示例,展示了如何实现分页"
给出此源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转换:
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>
制作:
<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来生成多个结果文档,这是不可能的.
It isn't possible by only using pure XSLT 1.0 to produce more than one result document by a single transformation.
您可以使用XSLT 2.0及其xsl:result-document
指令,也可以使用实现EXSLT的<exsl:document>
扩展元素的XSLT 1.0处理器.另一种选择是为每个输出页面启动一个单独的XSLT 1.0转换.
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.使用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发出此消息:
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
这篇关于在xsl中分页的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!