我正在体验与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页面,第一页与“我的名字”和第二页与“一些文本”。相反,我得到了两个空白页面。
发布于 2013-01-02 17:00:21
查看您的XSLT,您具有以下模板
<xsl:template match="/">这与XML文档的“文档节点”相匹配。这与XML文档的顶级元素不同,在本例中是 document 。/实际上是顶级元素的父元素。
这意味着稍后在您的模板中,当您执行以下应用模板时,如下所示
<xsl:apply-templates select="header"/>
<xsl:apply-templates select="body"/>它们分别有效地查找header和body的顶级元素。但是,header和body元素是顶级document元素的子元素。
要解决这个问题,您有几个选择。您可以使用以下内容替换您的应用模板:
<xsl:apply-templates select="document/header"/>
<xsl:apply-templates select="document/body"/>或者,您可以更改初始模板以匹配以下内容(而不仅仅是<xsl:template match="/">)
<xsl:template match="/document">同样值得注意的是,正如Dimitre在他的评论中提到的,在header和body的模板中,您正在执行<xsl:apply-templates />。但是,您没有与header或body的任何子元素匹配的模板。这意味着默认模板将生效,并且只输出元素的文本。
https://stackoverflow.com/questions/14113343
复制相似问题