XML / XSL表格式

时间:2010-07-20 02:56:35

标签: xml xslt xmltable

假设我有一个包含XML标签中500个名字的列表。我想使用XSLT在表中显示此列表。在XSLT表中,我希望最多有三行;我不在乎我有多少列 - 我打算将表放入可滚动的div中。如果我的名字列表增长到1,000,我仍然只需要三行,但列数可以增长到它需要的任何大小。

如何在XSLT中执行此操作?就XSL表而言,我熟悉xsl:for-each,但就是这样。

格式是这样的:

< node1>      < node2>           < NAME>数据< / NAME>           < NAME>数据< / NAME>                 ...      < / node2> < / node1>

2 个答案:

答案 0 :(得分:1)

此转化

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:param name="pnumRows" select="3"/>

 <xsl:variable name="vnumCells" select="count(/*/*/NAME)"/>
 <xsl:variable name="vcellsPerRow"
       select="ceiling($vnumCells div $pnumRows)"/>


 <xsl:template match="node2">
  <table>
    <xsl:apply-templates select="NAME[position() mod $vcellsPerRow = 1]"/>
  </table>
 </xsl:template>

 <xsl:template match="NAME">
  <tr>
    <xsl:apply-templates mode="copy" select=
    ". | following-sibling::*[not(position() >= $vcellsPerRow)]"/>
  </tr>
 </xsl:template>

 <xsl:template match="NAME" mode="copy">
  <td><xsl:value-of select="."/></td>
 </xsl:template>
</xsl:stylesheet>

在具有指定格式的任何XML文档上执行时,例如以下

<node1>
    <node2>
        <NAME>name1</NAME>
        <NAME>name2</NAME>
        <NAME>name3</NAME>
        <NAME>name4</NAME>
        <NAME>name5</NAME>
        <NAME>name6</NAME>
        <NAME>name7</NAME>
        <NAME>name8</NAME>
        <NAME>name9</NAME>
        <NAME>name10</NAME>
    </node2>
</node1>

生成想要的结果:一个包含三行的表,其中前两行具有相同数量的单元格,最后一行可能更短:

    <table>
   <tr>
      <td>name1</td>
      <td>name2</td>
      <td>name3</td>
      <td>name4</td>
   </tr>
   <tr>
      <td>name5</td>
      <td>name6</td>
      <td>name7</td>
      <td>name8</td>
   </tr>
   <tr>
      <td>name9</td>
      <td>name10</td>
   </tr>
</table>

答案 1 :(得分:0)

如果您正在讨论使用XSLT将XML转换为HTML表格,我建议您查看this article。他提供了一些模板,可以让你做你正在谈论的事情,但它可能需要一些调整。