2012-08-28 105 views
2

我正在尋找一種方式將XML文件分割成到底,應該包含一個表中的多個HTML文件多個HTML文件。拆分成XML使用XSLT

一個示例XML:

<?xml version="1.0" encoding="ISO-8859-1"?> 

<table> 
    <row> 
    <name>user1</name> 
    <email>email1</email> 
    </row> 
    <row> 
    <name>user2</name> 
    <email>email2</email> 
    </row> 
    <row> 
    <name>user3</name> 
    <email>email3</email> 
    </row> 
    <row> 
    <name>user4</name> 
    <email>email4</email> 
    </row> 
    <row> 
    <name>user5</name> 
    <email>email5</email> 
    </row> 

    ... 

</table> 

現在我想這個XML文件分割成包含從XML文件中的特定範圍內不同的HTML文件。例如,每個HTML文件應該包含來自XML的3行。

table1.html

<table> 
    <tr> 
    <td>user1</td> 
    <td>email1</td> 
    </tr> 
    <tr> 
    <td>user2</td> 
    <td>email2</td> 
    </tr> 
    <tr> 
    <td>user3</td> 
    <td>email3</td> 
    </tr> 
</table> 

table2.html

<table> 
    <tr> 
    <td>user4</td> 
    <td>email4</td> 
    </tr> 
    <tr> 
    <td>user5</td> 
    <td>email5</td> 
    </tr> 
    <tr> 
    <td>user6</td> 
    <td>email6</td> 
    </tr> 
</table> 

任何人的想法XSLT文件需要如何格式化?我使用ruby-xslt加載XML和XSLT文件,整件事轉換爲HTML。

回答

2

如果應用此XSLT您輸入XML將分裂XML到含3條記錄表:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

<xsl:strip-space elements="*"/> 
<xsl:output indent="yes" method="xml"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 
<!-- split file up into row elements --> 
<xsl:template match="row[position() mod 3 = 1]"> 
    <table> 
     <xsl:copy-of select=".|following-sibling::row[not(position() > 2)]"/> 
    </table> 
</xsl:template> 

<xsl:template match="row"/> 
</xsl:stylesheet> 

輸出XML:

<?xml version="1.0" encoding="UTF-8"?> 
<table> 
<table> 
    <row> 
     <name>user1</name> 
     <email>email1</email> 
    </row> 
    <row> 
     <name>user2</name> 
     <email>email2</email> 
    </row> 
    <row> 
     <name>user3</name> 
     <email>email3</email> 
    </row> 
</table> 
<table> 
    <row> 
     <name>user4</name> 
     <email>email4</email> 
    </row> 
    <row> 
     <name>user5</name> 
     <email>email5</email> 
    </row> 
</table> 
</table> 

如果你通過這個XSLT運行輸出XML你會得到想要的結果:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="row"> 
    <tr> 
     <xsl:apply-templates select="node()|@*"/> 
    </tr> 
</xsl:template> 

<xsl:template match="email | name"> 
    <td> 
     <xsl:apply-templates select="node()|@*"/> 
    </td> 
</xsl:template> 


</xsl:stylesheet> 

final OUTPUT XML:

<?xml version="1.0" encoding="UTF-8"?><table> 
<table> 
    <tr> 
     <td>user1</td> 
     <td>email1</td> 
    </tr> 
    <tr> 
     <td>user2</td> 
     <td>email2</td> 
    </tr> 
    <tr> 
     <td>user3</td> 
     <td>email3</td> 
    </tr> 
</table> 
<table> 
    <tr> 
     <td>user4</td> 
     <td>email4</td> 
    </tr> 
    <tr> 
     <td>user5</td> 
     <td>email5</td> 
    </tr> 
</table> 
</table> 

在我看來,只要您有機會在輸入XML上運行2個樣式表,就可以使用XSLT 1.0。

最好的問候, 彼得

1

要在一個單一的XSLT轉換創建多個HTML文件,你需要在xsl:結果文檔的指令,這是隻有在XSLT 2.0可用。不幸的是,你不會用ruby-xslt來獲取它。

0

的XSLT變換1.0只能創建單個輸出

您可能仍然有一個包含所有生成的表一個結果。然後,你需要處理以外XSLT該結果(或在其上進行N次變換),以產生所需要的N個獨立的輸出。

我強烈建議您使用XSLT 2.0執行此任務 - 可以使用新的xsl:result-document指令輕鬆完成此操作。