2

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

如何在 XSLT 中做到这一点?就 XSL 表而言,我对 xsl:for-each 很熟悉,但仅此而已。

格式是这样的:

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

4

2 回答 2

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>
于 2010-07-20T13:45:22.593 回答
0

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

于 2010-07-20T03:03:51.860 回答