2013-04-05 147 views
2

我有一個XSLT文件,用於使用fop引擎進行xsl-fo轉換。 它具有HTML元素的模板,如下圖所示使用不同名稱空間從HTML生成xsl fo的XSLT

<pre> 

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
        xmlns:fo="http://www.w3.org/1999/XSL/Format" 
        version="2.0"> 

    <xsl:template match="html"> 
    //handle html element 
    </xsl:template> 

    <xsl:template match="head/title"> 
    //handle head/title elements 
    </xsl:template> 

    </xsl:stylesheet> 

</pre> 

我需要轉換各種輸入給處理器提供的HTML文件。 沒有命名空間的HTML文件沒有任何問題處理。 但是,某些HTML文件具有名稱空間(<html xmlns="http://www.w3.org/1999/xhtml">) ,在這種情況下,fop處理器會拋出異常。 處理這類案件的最佳方式是什麼? 我可以創建一些基於local-name()的模板,調用正確的模板嗎?

回答

3

我在這種情況下的首選是在做其他事情之前,在一個單獨的過程中對輸入進行規範化。這可以通過模板規則來完成,如下所示:

<xsl:template match="*"> 
    <xsl:element name="lower-case(local-name())"> 
    <xsl:copy-of select="@*"/> 
    <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 
+0

...如果您有XSLT 2.0處理器... – MiMo 2013-04-06 19:07:22

1

你可以做這樣的事情:

<xsl:template match="*[local-name()='html' or local-name()='HTML']"> 
    //handle html element 
</xsl:template> 

,將匹配任何名稱空間htmlHTML元素。

不幸的是,HTML可能有很多變體,還包含無效的XML(例如,未關閉的標記)。如果你想要一個真正的通用解決方案,你需要一個HTML解析器。