2010-07-20 135 views
2

比方说,我有一个包含500个XML标签名称的列表。我想用XSLT在表格中显示这个列表。在XSLT表中,我希望最多有三行;我不在乎我有多少列 - 我打算把表放入一个可滚动的div。如果我的名称列表增长到1,000我仍然只需要三行,但列的数量可以增长到任何需要的大小。XML/XSL表格格式化

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

格式是这样的:

<节点1> <节点2> < NAME>数据</NAME> < NAME>数据</NAME> ... < /节点2> </node1>

+0

XML的格式是什么? “XSL表”是什么意思? – 2010-07-20 02:59:49

+0

“XSL表”是指XSLT格式化的HTML表格。 感谢下面的链接我会检查出来。 – 2010-07-20 03:20:22

+0

好问题(+1)。查看我的答案获得完整的解决方案。 – 2010-07-20 13:45:50

回答

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> 
0

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