XSLT模板无法正常显示

时间:2015-05-22 13:54:57

标签: xml templates xslt

我正在尝试使用XSLT将转换应用于XML文件。我需要创建一个不同的模板来为描述部分应用不同的格式。 我需要定义一个命名模板titleTemplate来显示书名 在Bold和Lightgray背景中。 并且只定义一个与以下元素匹配的模板: <author>, <isbn>, <yearEdition>, <publisher>
这是我想要实现的输出: enter image description here

XML

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="book.xsl"?>
<books>
<book copies="5">
<title>XML in a Nutshell</title>
<author>E.R.Harold, W.S.Means</author>
<isbn>9780596007645</isbn>
<yearEdition>2004/3Ed</yearEdition>
<publisher>OReilly Media </publisher>
</book>
<book copies="3">
<title>Thinking in Java</title>
<author>Bruce Eckel</author>
<isbn>9780131872486</isbn>
<yearEdition>2006/4Ed</yearEdition>
<publisher>Prentice Hall </publisher>
</book>
</books>

XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">

<html>
    <head>
        <title>3b</title>
    </head>
<body>
<h2>List of Books</h2>
    <table border="1">
        <tr bgcolor="Green"><th>Author</th><th>ISBN</th><th>YearEdition</th><th>Publisher</th></tr>
        <xsl:apply-templates/>
    </table>
</body>
</html>
</xsl:template>

<xsl:template match="books">
    <xsl:apply-templates select="book/title"/>
    <xsl:apply-templates select="book"/>
</xsl:template>

<xsl:template match="title">
    <xsl:call-template name="titleTemplate"/>
</xsl:template>

<xsl:template match="book">
    <tr>
        <td><xsl:value-of select="author/text()"/></td>
        <td><xsl:value-of select="isbn/text()"/></td>
        <td><xsl:value-of select="year/text()"/></td>
        <td><xsl:value-of select="publisher/text()"/></td>
    </tr>
</xsl:template>

<xsl:template name="titleTemplate">
        <xsl:sort select="title"/>
            <tr colspan="2"><td bgcolor="lightgray"><xsl:value-of select="text()"/></td></tr>
</xsl:template>

</xsl:stylesheet>

你能告诉我一些我可能错的地方吗?我刚开始学习模板。感谢。

2 个答案:

答案 0 :(得分:1)

我认为您不需要命名模板,按book排序title并为该元素编写模板,为book的其他子项编写一个模板:< / p>

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">

<html>
    <head>
        <title>3b</title>
    </head>
<body>
<h2>List of Books</h2>
    <table border="1">
        <tr bgcolor="Green"><th>Author</th><th>ISBN</th><th>YearEdition</th><th>Publisher</th></tr>
        <xsl:apply-templates/>
    </table>
</body>
</html>
</xsl:template>

<xsl:template match="books">

    <xsl:apply-templates select="book">
      <xsl:sort select="title"/>
    </xsl:apply-templates>
</xsl:template>

<xsl:template match="title">
    <tr><td colspan="4" align="center" bgcolor="lightgray"><xsl:value-of select="."/></td></tr>
</xsl:template>

<xsl:template match="book">
    <xsl:apply-templates select="title"/>
    <tr>
      <xsl:apply-templates select="author | isbn | yearEdition | publisher"/>
    </tr>
</xsl:template>

<xsl:template match="author | isbn | yearEdition | publisher">
    <td>
      <xsl:value-of select="."/>
    </td>           
</xsl:template>

</xsl:stylesheet>

答案 1 :(得分:1)

首先,你不能在xsl:template中使用排序,因为xsl:sort必须是xsl:apply-templates或xsl:for-each元素的子元素(参见http://www.w3.org/TR/xslt#element-sort) 如果要对书籍进行排序,则必须将排序功能放在书籍匹配模板中。

其次,如果要使用命名模板,可以传递params并在模板中使用它。 要将params传递给命名模板,请在模板中使用xsl:with-param指令和xsl:param指令(参见http://www.w3.org/TR/xslt#section-Passing-Parameters-to-Templates):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">

<html>
    <head>
        <title>3b</title>
    </head>
<body>
<h2>List of Books</h2>
    <table border="1">
        <tr bgcolor="Green"><th>Author</th><th>ISBN</th><th>YearEdition</th><th>Publisher</th></tr>
        <xsl:apply-templates/>
    </table>
</body>
</html>
</xsl:template>

<xsl:template match="books">
    <xsl:apply-templates select="book"><xsl:sort select="title"/></xsl:apply-templates>
</xsl:template>

<xsl:template match="book">
    <xsl:call-template name="titleTemplate">
        <xsl:with-param name="tit" select="title/text()"/>
    </xsl:call-template>
    <tr>
        <td><xsl:value-of select="author/text()"/></td>
        <td><xsl:value-of select="isbn/text()"/></td>
        <td><xsl:value-of select="year/text()"/></td>
        <td><xsl:value-of select="publisher/text()"/></td>
    </tr>
</xsl:template>

<xsl:template name="titleTemplate">
    <xsl:param name="tit" />
    <tr colspan="2"><td bgcolor="lightgray"><xsl:value-of select="$tit"/></td></tr>
</xsl:template>

</xsl:stylesheet>