2

我有一个 XSLT 文件,用于使用 fop 引擎将 html 转换为 xsl-fo。它具有 HTML 元素的模板,如下所示

<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 处理器会抛出异常。处理此类案件的最佳方法是什么?我可以创建一些基于本地名称()调用正确模板的模板吗?

4

2 回答 2

3

在这种情况下,我的偏好是在做任何其他事情之前,在单独的通道中规范化输入。这可以通过类似这样的模板规则来完成:

<xsl:template match="*">
  <xsl:element name="lower-case(local-name())">
    <xsl:copy-of select="@*"/>
    <xsl:apply-templates/>
  </xsl:element>
</xsl:template>
于 2013-04-05T20:52:00.413 回答
1

你可以这样做:

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

将匹配htmlHTML任何命名空间中的元素。

不幸的是,HTML 可以有很多变体,并且还包含无效的 XML(例如未关闭的标签)。如果你想要一个真正的通用解决方案,你需要一个 HTML 解析器。

于 2013-04-05T16:21:42.800 回答