在创建需要指定一列的行距的表时遇到了一些麻烦。 我有这个xml
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<artist>
<name>artist1</name>
<cd>cd1</cd>
<cd>cd2</cd>
<cd>cd3</cd>
</artist>
<artist>
<name>artist2</name>
<cd>cd2</cd>
<cd>cd4</cd>
</artist>
<artist>
<name>artist3</name>
<cd>cd5</cd>
<cd>cd4</cd>
</artist>
</catalog>
这个XSL
<?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>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th style="text-align:left">Artist</th>
<th style="text-align:left">CD</th>
</tr>
<xsl:for-each select="catalog/artist">
<tr>
<td rowspan="{count(cd)}">
<xsl:value-of select="count(cd)"/>
<xsl:value-of select="name"/>
</td>
<xsl:for-each select="cd">
<tr>
<td><xsl:value-of select="."/></td>
</tr>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
问题如下: 当行跨度为count(cd)时,如图所示,它无法正确显示 enter image description here 但是,如果我将count(cd)+1代替count(cd)(这没有意义,因为我希望行跨度与count(cd)相同,它可以正确显示,但是当我生成HTML时,如果窗口较小,则会产生额外的线条。 enter image description here
您有什么想法吗?
答案 0 :(得分:0)
count(cd)
显示正确的数字。只是您的HTML表结构不良。
一个问题是您将</tr>
放在错误的位置,这导致一行嵌套在一行中。
但是您的主要问题是,第一张CD必须与带有艺术家姓名的CD放在同一行。
尝试使用此XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th style="text-align:left">Artist</th>
<th style="text-align:left">CD</th>
</tr>
<xsl:for-each select="catalog/artist">
<tr>
<td rowspan="{count(cd)}">
<xsl:value-of select="count(cd)"/>
<xsl:value-of select="name"/>
</td>
<td><xsl:value-of select="cd[1]"/></td>
</tr>
<xsl:for-each select="cd[position() > 1]">
<tr>
<td><xsl:value-of select="."/></td>
</tr>
</xsl:for-each>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
或者,您也可以这样写
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th style="text-align:left">Artist</th>
<th style="text-align:left">CD</th>
</tr>
<xsl:for-each select="catalog/artist">
<xsl:variable name="cds" select="count(cd)" />
<xsl:variable name="artist" select="name" />
<xsl:for-each select="cd">
<tr>
<xsl:if test="position() = 1">
<td rowspan="{$cds}">
<xsl:value-of select="$cds"/>
<xsl:value-of select="$artist"/>
</td>
</xsl:if>
<td><xsl:value-of select="."/></td>
</tr>
</xsl:for-each>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>