2

我有一个 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 中的信息太长,应该在某些页面中显示。

我需要使用分页。我搜索并找到了这个页面(关于Xslt Paging 示例)来帮助我做到这一点。

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

我可以在没有 umbraco 的情况下做到这一点吗?

4

1 回答 1

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 转换。


二、使用 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
于 2012-09-02T16:11:31.720 回答