2013-04-05 70 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解析器。