【发布时间】:2012-03-14 17:55:33
【问题描述】:
我在 Windows 下使用 Xalan 1.10 的 C++ 版本,并试图从 xml 文档中生成 Apache FOP 文件。
文件相当大且复杂,但以下示例很好地说明了问题:
Input.xml
<?xml version="1.0" encoding="utf-8"?>
<root-xml-element>
<MyElement name="Some text"/>
</root-xml-element>
样式表.xsl
<xsl:transform version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="text" indent="no"/>
<xsl:template match="/">
<fo:root>
<xsl:text>(ROOT MATCHED)</xsl:text>
<xsl:apply-templates select="root-xml-element"/>
</fo:root>
</xsl:template>
<xsl:template match="root-xml-element">
<xsl:text>(ROOT ELEMENT MATCHED)</xsl:text>
<xsl:call-template name="MyTemplate"/>
</xsl:template>
<xsl:template name="MyTemplate">
<xsl:text>(MY TEMPLATE MATCHED)</xsl:text>
<fo:layout-master-set>
<fo:simple-page-master master-name="Master" page-width="29.7cm" page-height="21cm">
</fo:simple-page-master>
</fo:layout-master-set>
</xsl:template>
</xsl:transform>
转换完成没有任何错误,但产生以下不完整输出:
Xalan 的输出文件
(ROOT MATCHED)(ROOT ELEMENT MATCHED)(MY TEMPLATE MATCHED)
如您所见,输出文件中没有<fo:...> 标记。该模板显然已被应用。
当我对这些相同的文件运行 .NET xslt 处理器时,我得到了我期望的输出:
.NET XSLT 处理器的输出文件
<?xml version="1.0" encoding="utf-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
(ROOT MATCHED)(ROOT ELEMENT MATCHED)(MY TEMPLATE MATCHED)
<fo:layout-master-set>
<fo:simple-page-master master-name="Master" page-width="29.7cm" page-height="21cm" />
</fo:layout-master-set>
</fo:root>
同样的转换也适用于 Java Xalan 版本(不知道具体是哪一个)。另一方面,命令行 Xalan 可执行文件会产生相同的不完整输出,因此很可能不是我的代码搞砸了某些东西(或者是这样吗?)。
这里发生了什么?任何想法要检查什么?
【问题讨论】: