使用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")));