我正在尝试“嵌套” xsl:for-each(我认为)

时间:2019-03-27 01:05:40

标签: xml xslt html-table

非常简单,我试图按另一项列出项目-我尝试通过仅具有两个级别的乐队名称及其CD来使其变得简单

我正在尝试许多不同的方法-但无法获得xsl将xml分解为表中的单独列。

它实际上是针对房地产网站的,应该显示某些房地产的租金-但要使乐队及其CD的使用变得容易,...

我的XML

<catalog>
  <artist>
    <name>Band 1</name>
    <titles>
      <title>CD Title 1</title>
      <title>CD Title 2</title>
      <title>CD Title 3</title>
      <title>CD Title 4</title>
      <title>CD Title 5</title>
      <title>CD Title 6</title>
      <title>CD Title 7</title>
    </titles>
  </artist>
  <artist>
    <name>Band 2</name>
    <titles>
      <title>CD Title 10</title>
      <title>CD Title 20</title>
      <title>CD Title 30</title>
    </titles>
  </artist>
  <artist>
    <name>Band 3</name>
    <titles>
      <title>CD Title 100</title>
      <title>CD Title 200</title>
      <title>CD Title 300</title>
      <title>CD Title 400</title>
      <title>CD Title 500</title>
      <title>CD Title 600</title>
      <title>CD Title 700</title>
      <title>CD Title 800</title>
    </titles>
  </artist>
</catalog>

我的XSL

  <xsl:template match="/">
    <html>
    <body>
    <table border="1">
      <tr bgcolor="#ff3366">
        <th>Artist</th>
        <th>Title</th>
      </tr>
      <xsl:for-each select="catalog/artist">
        <tr>
          <td><xsl:value-of select="name"/></td>

          <td><xsl:value-of select="titles"/></td>
        </tr>
      </xsl:for-each>
    </table>
    </body>
    </html>
  </xsl:template>

我想要什么!

<table border="1">
  <tr>
    <th>Artist</th>
    <th>Title</th>
  </tr>
  <tr>
    <td>Band 1</td>
    <td>CD Title 1</td>
    <tr><td></td><td>CD Title 2</td></tr>
    <tr><td></td><td>CD Title 3</td></tr>
    <tr><td></td><td>CD Title 4</td></tr>
    <tr><td></td><td>CD Title 6</td></tr>
    <tr><td></td><td>CD Title 7</td></tr>
    <tr><td></td><td>CD Title 8</td></tr>
  </tr>
  <tr>
    <td>Band 2</td>
    <td>CD Title 10</td>
    <tr><td></td><td>CD Title 20</td></tr>
    <<tr><td></td><td>CD Title 30</td></tr>
    <tr><td></td><td>CD Title 40</td></tr>
    <<tr><td></td><td>CD Title 50</td></tr>
    <tr><td></td><td>CD Title 60</td></tr>
  </tr>
  <tr>
    <td>Band 3</td>
    <<td>CD Title 100</td>
    <tr><td></td><td>CD Title 200</td></tr>
    <tr><td></td><td>CD Title 300</td></tr>
    <tr><td></td><td>CD Title 400</td></tr>
  </tr>
</table>


What I get

<html>
  <body>
    <table border="1">
      <tr bgcolor="#ff3366">
        <th>Artist</th>
        <th>Title</th>
      </tr>
      <tr>
        <td>Band 1</td>
        <td>CD Title 1CD Title 2CD Title 3CD Title 4CD Title 5CD Title 6CD Title 7</td>
      </tr>
      <tr>
        <td>Band 2</td>
        <td>CD Title 10CD Title 20CD Title 30</td>
      </tr>
      <tr>
        <td>Band 3</td>
        <td>CD Title 100CD Title 200CD Title 300CD Title 400CD Title 500CD Title 600CD Title 700CD Title 800</td>
      </tr>
    </table>
  </body>
</html>

2 个答案:

答案 0 :(得分:0)

我怀疑您想要的HTML结果是否正确,因为您的第一个cap会出现异常情况。

因此,以下XSLT-1.0代码将创建(希望)所需的结果。我还将样式表的组织方式从title循环更改为模板。

for-each

其结果是:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" indent="yes" />

<xsl:template match="/catalog">
    <html>
    <body>
    <table border="1">
      <tr bgcolor="#ff3366">
        <th>Artist</th>
        <th>Title</th>
      </tr>
      <xsl:apply-templates select="artist" />
    </table>
    </body>
    </html>
  </xsl:template>

<xsl:template match="artist">
  <tr>
    <td><xsl:value-of select="name"/></td>
    <xsl:apply-templates select="titles/title" />
  </tr>
</xsl:template>

<xsl:template match="title[1]">
  <td><xsl:value-of select="text()"/></td>
</xsl:template>

  <xsl:template match="title">
    <tr>
        <td><xsl:value-of select="text()"/></td>
    </tr>
  </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:0)

在大家的帮助下,我终于想出了这件事!

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" indent="yes" />

<xsl:template match="/catalog">
    <html>
    <body>
    <table border="1">
      <tr bgcolor="#ff3366">
        <th>Artist</th>
        <th>Title</th>
      </tr>
      <xsl:apply-templates select="artist" />
    </table>
    </body>
    </html>
  </xsl:template>

<xsl:template match="artist">
  <tr>
    <td><xsl:value-of select="name"/></td>
    <xsl:apply-templates select="titles/title" />
  </tr>
</xsl:template>

<xsl:template match="title[1]">
  <td><xsl:value-of select="text()"/></td>
</xsl:template>

  <xsl:template match="title">
    <tr>
        <td></td>
        <td><xsl:value-of select="text()"/></td>
    </tr>
  </xsl:template>

</xsl:stylesheet>