XSL-FO 如何根据属性值获取动态静态内容
XSL-FO How can i get dynamic static content according to attribute value
我想使用模板调用创建静态内容。
我的每个元素都有一个 "pagemaster" 属性,该属性的名称与我声明的 simple-page-master 主名称之一完全相同。基于此属性,我决定将哪个 simple-page-master 用于每个元素。
现在我也想用这个属性来决定应该在页面上呈现哪些静态内容。
我之前的考虑是这样的:
<fo:layout-master-set>
.
.
.
</fo:layout-master-set>
<xsl:for-each-group select=".//reportelements/*[pagemaster != '']" group-adjacent="pagemaster">
<fo:page-sequence master-reference="{current-grouping-key()}">
<!-- Here is my Problem. This should call the Template below -->
<!-- What i want to achieve is that if "{current-grouping-key()}" is "TITLEPAGE" then the Template below gets called -->
<xsl:call-template name="{current-grouping-key()}"/>
<fo:flow flow-name="xsl-region-body">
<xsl:for-each select="current-group()">
<xsl:apply-templates select="."/>
</xsl:for-each>
</fo:flow>
</fo:page-sequence>
</xsl:for-each-group>
</fo:root>
</xsl:template>
<xsl:template name="TITLEPAGE">
<fo:static-content flow-name="xsl-region-after">
<fo:block text-align="right">
<fo:external-graphic src="url(file:C:\Logo.pdf)" content-width="6cm"/>
</fo:block>
</fo:static-content>
</xsl:template>
我现在遇到的问题是出现以下错误:
Static error in xsl:call-template/@name on line 59 column 73 of masterpage_report.xsl:
XTSE0020: Invalid QName {{current-grouping-key()}}
更改代码:-
<fo:page-sequence master-reference="{current-grouping-key()}">
<xsl:call-template name="{current-grouping-key()}"/>
to
<fo:page-sequence master-reference="current-grouping-key()">
<xsl:call-template name="current-grouping-key()"/>
我想你可以用
的形式定义一个全局参数或变量
<xsl:param name="static-content">
<content name="TITLEPAGE">
<fo:static-content flow-name="xsl-region-after">
<fo:block text-align="right">
<fo:external-graphic src="url(file:C:\Logo.pdf)" content-width="6cm"/>
</fo:block>
</fo:static-content>
</content>
<!-- add other named "content"s here -->
</xsl:param>
然后,您使用 <xsl:copy-of select="$static-content/content[@name = current-grouping-key()]/*"/>
.
而不是 <xsl:call-template name="{current-grouping-key()}"/>
为了提高效率,您还可以声明一个键 <xsl:key name="static-content" match="content" use="@name"/>
然后您将使用 <xsl:copy-of select="key('static-content', current-grouping-key(), $static-content)/*"/>
.
未经测试,但您可以将 xsl:call-template
替换为 xsl:apply-templates
以在 'static-content' 模式下处理 pagemaster 元素:
<xsl:apply-templates select="pagemaster" mode="static-content" />
'static-content' 模式下模板的 @match
属性将包含一个谓词,确保 pagemaster
值的模板是被处理的模板:
<xsl:template match="pagemaster[. = 'TITLEPAGE']"
mode="static-content">
<fo:static-content flow-name="xsl-region-after">
<fo:block text-align="right">
<fo:external-graphic src="url(file:C:\Logo.pdf)" content-width="6cm"/>
</fo:block>
</fo:static-content>
</xsl:template>
如果您不以其他方式处理 pagemaster
个元素,那么您甚至可能不需要单独模式。
我想使用模板调用创建静态内容。 我的每个元素都有一个 "pagemaster" 属性,该属性的名称与我声明的 simple-page-master 主名称之一完全相同。基于此属性,我决定将哪个 simple-page-master 用于每个元素。 现在我也想用这个属性来决定应该在页面上呈现哪些静态内容。
我之前的考虑是这样的:
<fo:layout-master-set>
.
.
.
</fo:layout-master-set>
<xsl:for-each-group select=".//reportelements/*[pagemaster != '']" group-adjacent="pagemaster">
<fo:page-sequence master-reference="{current-grouping-key()}">
<!-- Here is my Problem. This should call the Template below -->
<!-- What i want to achieve is that if "{current-grouping-key()}" is "TITLEPAGE" then the Template below gets called -->
<xsl:call-template name="{current-grouping-key()}"/>
<fo:flow flow-name="xsl-region-body">
<xsl:for-each select="current-group()">
<xsl:apply-templates select="."/>
</xsl:for-each>
</fo:flow>
</fo:page-sequence>
</xsl:for-each-group>
</fo:root>
</xsl:template>
<xsl:template name="TITLEPAGE">
<fo:static-content flow-name="xsl-region-after">
<fo:block text-align="right">
<fo:external-graphic src="url(file:C:\Logo.pdf)" content-width="6cm"/>
</fo:block>
</fo:static-content>
</xsl:template>
我现在遇到的问题是出现以下错误:
Static error in xsl:call-template/@name on line 59 column 73 of masterpage_report.xsl:
XTSE0020: Invalid QName {{current-grouping-key()}}
更改代码:-
<fo:page-sequence master-reference="{current-grouping-key()}">
<xsl:call-template name="{current-grouping-key()}"/>
to
<fo:page-sequence master-reference="current-grouping-key()">
<xsl:call-template name="current-grouping-key()"/>
我想你可以用
的形式定义一个全局参数或变量<xsl:param name="static-content">
<content name="TITLEPAGE">
<fo:static-content flow-name="xsl-region-after">
<fo:block text-align="right">
<fo:external-graphic src="url(file:C:\Logo.pdf)" content-width="6cm"/>
</fo:block>
</fo:static-content>
</content>
<!-- add other named "content"s here -->
</xsl:param>
然后,您使用 <xsl:copy-of select="$static-content/content[@name = current-grouping-key()]/*"/>
.
<xsl:call-template name="{current-grouping-key()}"/>
为了提高效率,您还可以声明一个键 <xsl:key name="static-content" match="content" use="@name"/>
然后您将使用 <xsl:copy-of select="key('static-content', current-grouping-key(), $static-content)/*"/>
.
未经测试,但您可以将 xsl:call-template
替换为 xsl:apply-templates
以在 'static-content' 模式下处理 pagemaster 元素:
<xsl:apply-templates select="pagemaster" mode="static-content" />
'static-content' 模式下模板的 @match
属性将包含一个谓词,确保 pagemaster
值的模板是被处理的模板:
<xsl:template match="pagemaster[. = 'TITLEPAGE']"
mode="static-content">
<fo:static-content flow-name="xsl-region-after">
<fo:block text-align="right">
<fo:external-graphic src="url(file:C:\Logo.pdf)" content-width="6cm"/>
</fo:block>
</fo:static-content>
</xsl:template>
如果您不以其他方式处理 pagemaster
个元素,那么您甚至可能不需要单独模式。