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 个元素,那么您甚至可能不需要单独模式。