我有一个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, ' ')" />
<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这样做吗?
答案 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