2011-06-25 54 views
4

我想創建一個XSL樣式表,它允許合併從另一個XHTML文件引用的XHTML文件。反過來,從引用文件引用的任何XHTML文件也應該被合併,依此類推。因此,應該可以將所有直接或間接通過起始XHTML文件引用的XHTML遞歸合併到一個XHTML文件中。參考文獻是嚴格等級的。使用XSLT遞歸合併XHTML文件到一個XHTML文件

實施例:

文件a.html:

<html> 
    <body>Text1<br/><a href="b.html">Link</a></body> 
</html> 

文件b.html:

<html> 
    <body>Text2<br/><a href="c.html">Link</a></body> 
</html> 

文件c.html:

<html> 
    <body>Text3<br/></body> 
</html> 

結果合併文件時從a.html開始:

<html> 
    <body>Text1<br/>Text2<br/>Text3<br/></body> 
</html> 

我不知道如何用XSLT解決這個問題。任何幫助表示讚賞。

+0

+1 - 一個很好的問題,很好的簡短例子。 –

+0

好問題,+1。 –

回答

0

這可能會有點棘手,但請檢查document()函數。

我見過的表演如何,包括你的輸出另一個文檔的例子,但我沒有看到,它可以讓你開始相同的調用過程中轉化該文件的任何實例。但我也沒有自己嘗試過。

如果不能解決問題,document()可以讓您將轉換遞歸到其他文檔中,您可以在循環中調用轉換,並編寫要重複調用的轉換。那麼你需要一些方法來檢查什麼時候可以停止轉換。

知道何時應該停止的一種方法是在源文檔和目標文檔之間進行區分。

另一種方法是將元素放置在文檔的頂部(如果找到任何子文檔),並在找不到時將其刪除。然後檢查這個元素的存在。

但也許有一種方法可以繼續通過包含的子文檔進行轉換。

3

贊Merlyn Morgan-Graham說,關鍵是document()函數。這不是棘手雖然...

這個樣式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

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

    <xsl:template match="a"> 
    <xsl:apply-templates select="document(@href)/html/body/node()"/> 
    </xsl:template> 

</xsl:stylesheet> 

與3個HTML文件,並使用a.html作爲輸入,結果在這個輸出:

<html> 
    <body>Text1<br/>Text2<br/>Text3<br/> 
    </body> 
</html> 

而且,真正使這成爲可能是身份轉換。它傳遞任何不與另一個模板不匹配的東西。

0

這種轉變

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

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

<xsl:template match="a"> 
    <xsl:apply-templates select= 
    "document(@href)/*/body/node()"/> 
</xsl:template> 
</xsl:stylesheet> 

當文件 「a.html」 適用於:

<html> 
    <body>Text1<br/><a href="b.html">Link</a></body> 
</html> 

產生想要的,正確的結果

<html><body>Text1<br/>Text2<br/>Text3<br/></body></html> 

說明

  1. 身份規則副本的每個節點 「原樣」。

  2. 唯一的重寫模板匹配任何a元素。

  3. 在此模板中,啓動a元素的href屬性中指向的文檔處理。我們必須使用標準的XSLT功能document()