Почемуне отображать правильное количество строк - PullRequest
0 голосов
/ 07 марта 2019

У меня возникли проблемы при создании таблицы, в которой необходимо указать диапазон строк одного столбца. У меня есть этот 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>

Проблема заключается в следующем: Когда rowspan равен count (cd), он не отображается должным образом, как вы можете видеть на рисунке введите описание изображения здесь Но если я поставлю count (cd) +1 вместо count (cd) (что не имеет смысла, так как я хочу, чтобы размер строки соответствовал размеру count (cd), он отображается правильно, но когда я генерирую HTML, если окно меньше, создает дополнительную строку из-за наличия дополнительного ряда. введите описание изображения здесь

У вас есть идеи?

1 Ответ

0 голосов
/ 07 марта 2019

count(cd) показывает правильный номер. Просто ваша HTML-таблица плохо структурирована.

Одна проблема заключается в том, что закрывающая строка </tr> находится не в том месте, что приводит к тому, что строка вкладывается в строку.

Но ваша главная проблема в том, что первый компакт-диск должен идти в той же строке, что и тот, в котором указано имя исполнителя.

Попробуйте вместо этого 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...