2010-07-20 127 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。他提供了一些模板,可以讓你做你正在談論的內容,但它可能會稍微調整一下。