通过XSLT将XML节点中的HTML转义为XSL-FO

时间:2013-07-25 15:20:02

标签: java xml xslt xalan apache-fop

我有一份必须以PDF格式生成的文档。我使用Xalan和Apache FOP将XSLT中的XML处理成XSL-FO。

在我的XML树中有一个这样的节点:

<root>
    <formula>
        <text>3+10*10^-6*l</text>
        <html>&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;3 &middot; + 10 &middot; 10&lt;sup&gt;-6&lt;/sup&gt; · &lt;i&gt;l&lt;/i&gt;&lt;/html&gt;</html>
    </formula>     
</root>

我怎样才能获得正确的HTML(使用disable-output-escaping="yes"),还可以获得我稍后可以处理的节点集(exsl:node-set?)?我的意思是,我希望获得该HTML公式的XSL-FO表示,以便将其集成到我的PDF输出中。

这样的东西
<xsl:template match="xhtml:b">
    <fo:inline font-weight="bold"><xsl:apply-templates/></fo:inline>
</xsl:template>

可能有使用saxon:parse()的解决方案。但是,我无法从Xalan-J切换到那个。

我的情景中是否有解决方案?

1 个答案:

答案 0 :(得分:1)

你当然可以用Xalan编写一个样式表来处理

<xsl:template match="html">
  <xsl:value-of select="." disable-output-escaping="yes"/>
</xsl:template>

然后使用XHTML标记创建序列化结果文档。

然后,第二个样式表可以处理第一个样式表的结果文档,例如

<xsl:template match="xhtml:html" xmlns:xhtml="http://www.w3.org/1999/xhtml">
  <xsl:apply-templates/>
</xsl:template>

但是你不能在一个带有结果树片段的样式表中这样做,因为 doe (disable-output-escaping)是一个序列化功能,如果你使用转换为节点的结果树片段在一个样式表中在exsl:node-set或类似的帮助下设置,没有序列化发生。

仔细观察,因为您的代码段似乎包含对未声明实体(如&middot;)的引用,我认为该示例根本不会解析为XML,因此您需要先修复它以进行任何XSLT处理。