XSL重复模板对象包含List <object> </object>

时间:2013-12-17 05:02:24

标签: templates xslt limit repeat items

我有一个包含Books集合的Library对象... Library对象具有Name,Address,Phone等属性...... Book对象具有ISDN,Title,Author和Price等属性。

XML看起来像这样......

<Library>
    <Name>Metro Library</Name>
    <Address>1 Post Rd. Brooklyn, NY 11218</Address>
    <Phone>800 976-7070</Phone>
    <Books>
        <Book>
            <ISDN>123456789</ISDN>
            <Title>Fishing with Luke</Title>
            <Author>Luke Miller</Author>
            <Price>18.99</Price>
        </Book>
        <Book>
            <ISDN>234567890</ISDN>
            <Title>Hunting with Paul</Title>
            <Author>Paul Worthington</Author>
            <Price>28.99</Price>
        </Book>
        ...
        And more books
        ...
    </Books>
</Library>

我有一个空间模板,例如每页只有10个。书籍列表中可能有数百本书...所以我需要限制书籍数量,每10本书重复一次。

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <body>
                <div>
                    <table>
                        <tr>
                            <td>NAME</td>
                            <td><xsl:value-of select="/Library/Name"/></td>              
                        </tr>
                  <tr>
                            <td>ADDRESS</td>
                            <td><xsl:value-of select="/Library/Address"/></td>              
                        </tr>
                        <tr>
                            <td>PHONE</td>
                            <td><xsl:value-of select="/Library/Phone"/></td>              
                        </tr>
                   </table>
                   <table>
                       <xsl:for-each select="/Library/Books/Book">
                           <tr>
                               <td><xsl:value-of select="position()"/></td>
                               <td><xsl:value-of select="ISDN"/></td>
                               <td><xsl:value-of select="Title"/></td>
                               <td><xsl:value-of select="Author"/></td>
                               <td><xsl:value-of select="Price"/></td>                
                           </tr>
                       </xsl:for-each>
                   </table>
               </div>
           </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

如何让图书馆信息显示在所有重复页面上,每页增加10本书?...第一页有图书信息,图书1到10,第二页有图书信息,图书11到20,等等上??

由于

1 个答案:

答案 0 :(得分:0)

对于初学者,尽量不要使用for-eachapply-templates允许引擎优化处理事件的顺序。

您似乎从其他系统调用此样式表,因此我采用的方法是定义分页param。在宿主语言中,当您调用它时只需更改根参数。然后,您可以在此处选择此行中的需求页面:

Books/Book[($page - 1)*10 &lt; position() and position() &lt;= ($page)*10]

这应该可以解决问题。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:param name="page" select="1"/>
  <xsl:template match="/Library">
    <html>
        <body>
            <div>
                <table>
                    <tr>
                        <td>NAME</td>
                        <td>
                            <xsl:value-of select="/Name"/>
                        </td>
                    </tr>
                    <tr>
                        <td>ADDRESS</td>
                        <td>
                            <xsl:value-of select="/Address"/>
                        </td>
                    </tr>
                    <tr>
                        <td>PHONE</td>
                        <td>
                            <xsl:value-of select="/Phone"/>
                        </td>
                    </tr>
                </table>
                <table>
                    <xsl:apply-templates select="Books/Book[($page - 1)*10 &lt; position() and position() &lt;= ($page)*10]"/>
                </table>
            </div>
        </body>
    </html>
  </xsl:template>
  <xsl:template match="/Book">
    <tr>
        <td>
            <xsl:value-of select="position()"/>
        </td>
        <td>
            <xsl:value-of select="ISDN"/>
        </td>
        <td>
            <xsl:value-of select="Title"/>
        </td>
        <td>
            <xsl:value-of select="Author"/>
        </td>
        <td>
            <xsl:value-of select="Price"/>
        </td>
    </tr>
  </xsl:template>
</xsl:stylesheet>