XSLT变量中的RTF在XSLTC TrAX中丢失名称空间URI

时间:2014-03-17 17:17:48

标签: xslt namespaces xalan

使用org.apache.xalan.xsltc.trax.TransformerFactoryImpl XSLT转换器工厂时,当结果树保存在变量中时,映射到前缀的URI会丢失。

考虑以下namespace.xsl XSLT:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:html="http://www.w3.org/1999/xhtml">

    <xsl:template match="/node">
        <xsl:variable name="Var">
            <xsl:apply-templates select="body"/>
        </xsl:variable>
        <xsl:copy-of select="$Var" />
    </xsl:template>

    <xsl:template name="wrap" match="body">
        <xsl:comment><xsl:value-of select="system-property('xsl:vendor')" />(<xsl:value-of select="system-property('xsl:version')" />)[<xsl:value-of select="system-property('xsl:vendor-url')" />]</xsl:comment>
        <html>
            <xsl:copy-of select="." />
        </html>
    </xsl:template>
</xsl:stylesheet>

使用以下namespace.xml输入

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="namespace.xsl"?>

<node xmlns:html="http://www.w3.org/1999/xhtml">
    <body>
        <html:h1 html:align="center">
            Hallo
        </html:h1>
    </body>
</node>

结果是

<?xml version="1.0" encoding="UTF-8"?><!--Apache Software Foundation (Xalan 
    XSLTC)(1.0)[http://xml.apache.org/xalan-j] -->
<html xmlns:html="http://www.w3.org/1999/xhtml">
    <body>

        <h1 xmlns:html="html" html:align="center">
            Hallo
        </h1>

    </body>
</html>

请注意 h1 没有前缀且前缀 html 内的内容已分配给uri“ html ”。

当我将transformfactory设置为'org.apache.xalan.processor.TransformerFactoryImpl'时,一切都按预期工作,我得到以下结果:

<?xml version="1.0" encoding="UTF-8"?><!--Apache Software Foundation(1.0)[http://xml.apache.org/xalan-j] -->
<html xmlns:html="http://www.w3.org/1999/xhtml">
    <body>
        <html:h1 html:align="center">
            Hallo
        </html:h1>

    </body>
</html>

我找不到任何已知问题,有谁知道我在这里做错了什么?

以下Java代码用于运行transformatin:

System.setProperty("javax.xml.transform.TransformerFactory", "org.apache.xalan.xsltc.trax.TransformerFactoryImpl");
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer(new StreamSource("namespace.xsl"));
transformer.transform(new StreamSource("namespace.xml"), new StreamResult(new FileOutputStream("namespace_out.xml")));

0 个答案:

没有答案