【问题标题】:XSLT to generate xsl fo from HTML with varying namespaceXSLT 从具有不同命名空间的 HTML 生成 xsl fo
【发布时间】:2013-03-28 03:04:20
【问题描述】:

我有一个 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 文件具有名称空间 (&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;) 在这种情况下,fop 处理器会抛出异常。 处理此类案件的最佳方法是什么? 我可以创建一些基于 local-name() 调用正确模板的模板吗?

【问题讨论】:

    标签: html xslt xml-namespaces xsl-fo apache-fop


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      你可以这样做:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-13
        • 1970-01-01
        相关资源
        最近更新 更多