我正在Windows下使用C ++版本的Xalan 1.10,我正在尝试用xml文档生成Apache FOP文件。
文件相当大而且复杂,但以下示例很好地说明了问题:
Input.xml文件
<?xml version="1.0" encoding="utf-8"?>
<root-xml-element>
<MyElement name="Some text"/>
</root-xml-element>
Stylesheet.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可执行文件产生相同的不完整输出,所以很可能不是我的代码弄乱了某些东西(或者它是什么?)。
这里发生了什么?任何想法要检查什么?
答案 0 :(得分:2)
您的输出方法设置为文本。我怀疑Xalan只输出实际文本,而不是XML节点;我记不清哪个是正确的行为,所以我不确定它是Xalan还是.NET的行为不正确(如果规范的灵活性可能都不行),但是,如果你将输出方法改为XML,它应该可行