使用XSLT分页将XML转换为HTML

时间:2013-10-16 17:50:59

标签: html xml xslt pagination

我知道这里有一些问题,我尝试了很多解决方案,但我仍然陷入困境。 我尝试使用此pagination in xsl 而这Possible to split XML into multiple pages with XSLT?却没有得到我需要的东西,

我需要在生成的html中创建一个分页,使用XML通过XSLT解析器。

XML文件就像这样

<root>
    <result>
        <a>field one</a>
        <b>field two</b>
        <c>field three</c>
    </result>
    <result>
        <a>hello</a>
        <b>thanks</b>
        <c>for help</c>
    </result>
    <result>
        <a>thank</a>
        <b>you</b>
        <c>!!</c>
    </result>
    ..... 
</root>

我的XSLT没有分页就是这个

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    xmlns:user="http://mycompany.com/mynamespace">


    <xsl:output method="html" indent="yes" />

    <xsl:template match="/">
        <html>
            <body>
                <xsl:apply-templates />
            </body>
        </html>
    </xsl:template>

    <xsl:template match="root">
                    <xsl:for-each select="result">
                        <div class="list_item">
                            <div class="dmv_line">
                                <div class="box_text">
                                    <h2><xsl:value-of select="a"/></h2>
                                </div>
                                </div>
                                <div class="dmv_line">
                                    <div class="box_text">
                                        <h2><xsl:value-of select="b"/></h2>
                                    </div>
                                </div>
                                <div class="dmv_line">
                                    <div class="box_text">
                                        <h2><xsl:value-of select="c"/></h2>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </xsl:for-each>
    </xsl:template>


</xsl:stylesheet>

我需要的是创建一个{3},将结果3乘3或4乘4封装,我将在javascript中隐藏或显示。 感谢

[编辑]: HTML输出,如果我假设每页分页2个元素,并且仅考虑示例中的3个元素,则输出应为

<div>

1 个答案:

答案 0 :(得分:1)

对于这样的问题,方法是首先选择将在每个“页面”上首先出现的元素。这是通过检查其位置来实现的。

<xsl:for-each select="result[position() mod $size = 1]">

因此,如果 $ size 变量设置为2,则会在位置1,3,5等中选择结果元素...

在此循环中,您可以输出包含 div 标记的'age'

<div id="{position()}">  

请注意,position是上下文相关的,它将返回您刚刚选择的节点集中节点的位置(即它将返回1,2,3等)

最后,要获得构成“页面”的结果元素,您可以选择它们

<xsl:apply-templates select="self::*|following-sibling::*[position() &lt; $size]" />

匹配它们的模板实际上就像 xsl:for-each 中的现有代码一样。

尝试以下XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:param name="size" select="2"/>

   <xsl:output method="html" indent="yes"/>

   <xsl:template match="/">
      <html>
         <body>
            <xsl:apply-templates/>
         </body>
      </html>
   </xsl:template>

   <xsl:template match="root">
      <xsl:for-each select="result[position() mod $size = 1]">
         <div id="{position()}">
            <xsl:apply-templates select="self::*|following-sibling::*[position() &lt; $size]"/>
         </div>
      </xsl:for-each>
   </xsl:template>

   <xsl:template match="result">
      <div class="list_item">
         <div class="dmv_line">
            <div class="box_text">
               <h2>
                  <xsl:value-of select="a"/>
               </h2>
            </div>
         </div>
         <div class="dmv_line">
            <div class="box_text">
               <h2>
                  <xsl:value-of select="b"/>
               </h2>
            </div>
         </div>
         <div class="dmv_line">
            <div class="box_text">
               <h2>
                  <xsl:value-of select="c"/>
               </h2>
            </div>
         </div>
      </div>
   </xsl:template>
</xsl:stylesheet>

这应该可以为您提供所需的输出。

顺便说一下,你的代码中有一些代码重复。尝试使用这两个模板替换匹配结果的模板:

<xsl:template match="result">
   <div class="list_item"> 
      <xsl:apply-templates select="a|b|c" />
   </div>
</xsl:template>

<xsl:template match="result/*">
      <div class="dmv_line">
         <div class="box_text">
            <h2>
               <xsl:value-of select="."/>
            </h2>
         </div>
       </div>
</xsl:template>