我是XML转换的新手,我目前正在处理XSLT文件。我想把每个人放在一起。在我在第一个模板中创建的表中,将元素,不同的行及其子节点(name,acct-no,fav-color)添加到每行的不同列中。我正在应用与" person"匹配的第二个模板。元素因此,对于每个人元素,可以插入表行及其单元格。
这是我的XML文件。
<?xml version="1.0" encoding="iso-8859-1" standalone="no"?>
<?xml-stylesheet href="people.xsl" type="text/xsl"?>
<people>
<list-name>Favorite Colors</list-name>
<person>
<name>
<first>Bob</first>
<last>Toddson</last>
</name>
<acct-no>327598</acct-no>
<fav-color hex="#ff0000">Red</fav-color>
</person>
<person>
<name>
<first>Red</first>
<last>McBlue</last>
</name>
<acct-no>209890</acct-no>
<fav-color hex="#00ff00">Green</fav-color>
</person>
<person>
<name>
<first>Tammy</first>
<last>Yu</last>
</name>
<acct-no>978541</acct-no>
<fav-color hex="#7fff00">Chartreuse</fav-color>
</person>
<person>
<name>
<first>Phillip</first>
<last>Cardwell</last>
</name>
<acct-no>258929</acct-no>
<fav-color hex="#d2b48c">Tan</fav-color>
</person>
</people>
和XSL文件。
<xsl:template match="/">
<head>
<title> People Report: <xsl:value-of select="/people/list-name" />
</title>
</head>
<body>
<center>
<h1> People Report: <xsl:value-of select="/people/list-name" /> </h1>
</center>
<table border="1" align="center">
<tr>
<td>Last Name</td>
<td>First Name</td>
<td>Account Number</td>
<td>Favorite Color</td>
</tr>
<xsl:apply-templates select="/people/person" />
</table>
</body>
</html>
</xsl:template>
<xsl:template match="person">
<tr>
<td>
<xsl:value-of select="name/last" />
</td>
<td>
<xsl:value-of select="name/first" />
</td>
<td>
<xsl:value-of select="acct-no" />
</td>
<td>
<xsl:value-of select="fav-color" />
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
我的当前输出仅将所有person元素及其子节点放在表的第一行第一列中。我认为我的问题是由于没有使用for-each命令和apply-templates,所以它可以迭代每个人元素。正如我在SE中的相关帖子中所读到的那样,apply-templates命令将适用于每个person元素,因此在我的情况下使用for-each不是必需的。我现在已经挣扎了几个小时,我无法看到或理解我在哪里遗漏了什么,所以任何帮助都会受到赞赏。
预期产出:
输出我得到:
先谢谢。
答案 0 :(得分:1)
试试这个模板:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="/">
<html>
<head>
<title> People Report: <xsl:value-of select="/people/list-name" />
</title>
</head>
<body>
<center>
<h1> People Report: <xsl:value-of select="/people/list-name" /> </h1>
</center>
<table border="1" align="center">
<tr>
<td>Last Name</td>
<td>First Name</td>
<td>Account Number</td>
<td>Favorite Color</td>
</tr>
<xsl:for-each select="/people/person">
<tr>
<td>
<xsl:value-of select="name/last" />
</td>
<td>
<xsl:value-of select="name/first" />
</td>
<td>
<xsl:value-of select="acct-no" />
</td>
<td>
<xsl:value-of select="fav-color" />
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
我会将xmlns="http://www.w3.org/1999/xhtml"
移动到样式表的根元素,如
<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
确保所有模板中的所有结果元素都是作为XHTML元素创建的。
然后对我来说,完整的样本http://home.arcor.de/martin.honnen/xslt/test2014030901.xml在IE 10和当前版本的Firefox和Opera中呈现得很好。