0

我正在使用 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 页面,第一页带有“我的名字”,第二页带有“一些文字”。相反,我得到两个空页。

4

1 回答 1

1

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

<xsl:template match="/">

这与 XML 文档的“文档节点”匹配。这与 XML 文档的顶级元素不同,在您的情况下是文档。/ 实际上是顶级元素的父元素。

这意味着稍后在您的模板中,当您执行以下应用模板时,就像这样

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

它们分别有效地寻找标题正文的顶级元素。但是,您的headerbody元素是顶级文档元素的子元素。

为了解决这个问题,你有几个选择。你可以用这些替换你的应用模板:

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

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

<xsl:template match="/document">

同样值得注意的是,正如 Dimitre 在他的评论中提到的,在你的headerbody模板中,你正在做<xsl:apply-templates />. 但是,您没有与headerbody的任何子元素匹配的模板。这意味着默认模板将启动,并且只输出元素的文本。

于 2013-01-02T09:00:20.540 回答