xsl到pdf - 空页面

时间:2013-01-01 19:07:11

标签: xml xslt xsl-fo

我正在体验xsl和pdf输出。我有一个像这样的xml文件:

<?xml version="1.0" encoding="utf-8" ?>
  <document>
    <header>
      <author>my name</author>
    </header>
    <body>
      <text>some text</text>
    </body>
  </document>

我的xsl文件如下:

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

<xsl:template match="/">
  <fo:root>

    <fo:layout-master-set>
      <fo:simple-page-master
        master-name="_title"
        page-height="29.7cm"
        page-width="21cm"
        margin="3cm">
        <fo:region-body/>
      </fo:simple-page-master>

      <fo:simple-page-master
        master-name="_body"
        page-height="29.7cm"
        page-width="21cm"
        margin="3cm">
        <fo:region-body/>
      </fo:simple-page-master>

      <fo:page-sequence-master master-name="titlepage">
        <fo:single-page-master-reference master-reference="_title"/>
      </fo:page-sequence-master>

      <fo:page-sequence-master master-name="body">
        <fo:repeatable-page-master-reference master-reference="_body"/>
      </fo:page-sequence-master>

    </fo:layout-master-set>

    <fo:page-sequence master-reference="titlepage">
      <fo:flow flow-name="xsl-region-body" font-family="Courier" font-size="12pt">
        <fo:block>
          <xsl:apply-templates select="header"/>
        </fo:block>
      </fo:flow>
    </fo:page-sequence>

    <fo:page-sequence master-reference="body">
      <fo:flow flow-name="xsl-region-body" font-family="Courier" font-size="12pt">
        <fo:block>
          <xsl:apply-templates select="body"/>
        </fo:block>
      </fo:flow>
    </fo:page-sequence>
    </fo:root>
  </xsl:template>

  <xsl:template match="header">
    <xsl:apply-templates />
  </xsl:template>

  <xsl:template match="body">
    <xsl:apply-templates />
  </xsl:template>
</xsl:stylesheet>

我希望有两个pdf页面,第一页带有“我的名字”,第二页带有“一些文字”。相反,我得到两个空页。

1 个答案:

答案 0 :(得分:1)

查看您的XSLT,您有以下模板

<xsl:template match="/">

这匹配XML文档的“文档节点”。这与XML文档的顶级元素不同,后者在您的案例中为文档。 /实际上是顶级元素的父级。

这意味着稍后在您的模板中,当您执行以下apply-templates时,如此

<xsl:apply-templates select="header"/>
<xsl:apply-templates select="body"/>

这些分别有效地寻找标题正文的顶级元素。但是,标题正文元素是顶级文档元素的子元素。

要解决此问题,您有几个选择。您可以使用以下代码替换apply-templates:

<xsl:apply-templates select="document/header"/>
<xsl:apply-templates select="document/body"/>

或者,您可以更改初始模板以匹配以下内容(而不仅仅是<xsl:template match="/">

<xsl:template match="/document">

同样值得注意的是,正如Dimitre在评论中提到的,标题正文的模板中,您正在进行<xsl:apply-templates />。但是,您没有与标题正文的所有子元素匹配的模板。这意味着默认模板将启动,而只是输出元素的文本。