我正在尝试使用XSLT将转换应用于XML文件。我需要创建一个不同的模板来为描述部分应用不同的格式。
我需要定义一个命名模板titleTemplate来显示书名
在Bold和Lightgray背景中。
并且只定义一个与以下元素匹配的模板:
<author>, <isbn>, <yearEdition>, <publisher>
。
这是我想要实现的输出:
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>
你能告诉我一些我可能错的地方吗?我刚开始学习模板。感谢。
答案 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>