我正在体验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页面,第一页带有“我的名字”,第二页带有“一些文字”。相反,我得到两个空页。
答案 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 />
。但是,您没有与标题或正文的所有子元素匹配的模板。这意味着默认模板将启动,而只是输出元素的文本。