XSLT转换输出中缺少的部件

时间:2012-02-24 09:10:51

标签: xslt xalan

我正在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可执行文件产生相同的不完整输出,所以很可能不是我的代码弄乱了某些东西(或者它是什么?)。

这里发生了什么?任何想法要检查什么?

1 个答案:

答案 0 :(得分:2)

您的输出方法设置为文本。我怀疑Xalan只输出实际文本,而不是XML节点;我记不清哪个是正确的行为,所以我不确定它是Xalan还是.NET的行为不正确(如果规范的灵活性可能都不行),但是,如果你将输出方法改为XML,它应该可行