为什么显示的行数不正确

时间:2019-03-07 15:10:11

标签: html xml xslt

在创建需要指定一列的行距的表时遇到了一些麻烦。 我有这个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

您有什么想法吗?

1 个答案:

答案 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>