XML解析:如何将相同类型的兄弟分成不同的单元格?

时间:2012-03-09 12:42:55

标签: html xml xslt xpath

XML文件:

<books>
    <scifi key=...>
       <author>Don Larson</author>
       <title>The Edge</title>
       <year>...</year>
    </scifi>
    <scifi key=...>
       <author>Don Larson</author>
       <author>James Kiddleton</author>
       <author>Danny Wobers</author>
       <title>Incognitum</title>
       <year>1987</year>
    </scifi>
    <scifi key=...>
       <author>....</author>
       <author>....</author>
       <title>...</title>
       <year>...</year>
    </scifi>
    etc......................
</books>

XSL文件:

<xsl:template match="/">
  <html>
  <body>
    <center><h1>SciFi</h1>
    <table border="1">
    <tr>
      <th>Title</th>
      <th>Authors</th>
      <th>Year</th>
    </tr>
      <xsl:for-each select="books/scifi">
      <xsl:sort select="year"/>
    <tr>
      <td><center><xsl:value-of select="title"/></center></td>
      <td>
       <xsl:for-each select="author">
        <p><xsl:value-of select="."/></p>
        </xsl:for-each>
      </td> 
      <td><xsl:value-of select="year"/></td>
    </tr>
    </xsl:for-each>
    </table>
    </center>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet> 

当显示上表时,对于包含标题的每个单元格,其旁边的单元格包含与该标题相关的所有作者

例如:

    Title         Authors        Year
   (1cell)        (1cell)       (1cell)
    -----         -------        ----
                 Don Larson
 Incognitum   James Kiddleton    1987
                Danny Wobers

现在我要做的是每个标题显示作者(如果有多个是......)在不同的单元格中与它相关并改为:

    Title         Authors        Year
   (3cells)        (3cells)    (3cells)
    -----         -------        ----
 Incognitum      Don Larson      1987
 Incognitum   James Kiddleton    1987
 Incognitum     Danny Wobers     1987

我没有一个单元格用于标题,一个单元格包含与该标题相关的所有三个作者,我希望有三个具有相同标题的单元格,并且每个单元格都可以在其旁边有一个与相关作者相关的单元格。 / p>

我仍然希望继续对所有内容进行排序,我仍然希望我的单元格的顺序(左 - >右)为Title-&gt; Author-&gt; Year

我的XSL文件需要更改什么?

2 个答案:

答案 0 :(得分:0)

每个作者需要一行,因此请更改

<tr>
  <td><center><xsl:value-of select="title"/></center></td>
  <td>
   <xsl:for-each select="author">
    <p><xsl:value-of select="."/></p>
    </xsl:for-each>
  </td> 
  <td><xsl:value-of select="year"/></td>
</tr>

 <xsl:for-each select="author">
<tr>
  <td><center><xsl:value-of select="../title"/></center></td>
  <td>

    <xsl:value-of select="."/>

  </td> 
  <td><xsl:value-of select="../year"/></td>
</tr>
  </xsl:for-each>

大卫

答案 1 :(得分:0)

快速修复

<xsl:template match="/">
  <html>
  <body>
    <center><h1>SciFi</h1>
    <table border="1">
    <tr>
      <th>Title</th>
      <th>Authors</th>
      <th>Year</th>
    </tr>
      <xsl:for-each select="books/scifi">
        <xsl:sort select="year"/>
        <xsl:for-each select="author">
    <tr>
      <td><center><xsl:value-of select="../title"/></center></td>
      <td>
       <xsl:for-each select=".">
        <p><xsl:value-of select="."/></p>
        </xsl:for-each>
      </td> 
      <td><xsl:value-of select="../year"/></td>
    </tr>
       </xsl:for-each>
    </xsl:for-each>
    </table>
    </center>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet> 

但是从长远来看,我建议从一个模板移动到嵌套for-eachs到结构化样式表,模板将每个元素类型映射到结果,然后执行apply-templates以继续。