繁体   English   中英

Xsl-Fo如何解决分组引起的多个模板调用?

[英]Xsl-Fo How to fix multiple template call caused by grouping?

我有一个问题,当我将for-each-groupfor-each select="current-group()"apply-templates select="."结合使用时apply-templates select="." 相同的模板ist对相同的元素调用了两次,从而导致对生成的ID进行双重定义。

我的xml如下所示:

<?xml version="1.0" encoding="utf-8"?>
<root>
    <report>
        <reportelements>
            <section name="1 section">
                <pagemaster>DIN-A4-PREFACE</pagemaster>
                <reportelements>
                    <picture name="1.1 picture">
                        <pagemaster>TITLEPAGE</pagemaster>
                        <reportelements />
                    </picture>
                    <section name="1.2 section">
                        <pagemaster>DIN-A4-PREFACE</pagemaster>
                        <subtitlecontent />
                        <reportelements>
                            <paragraph name="1.2.1 paragraph">
                                <pagemaster>TITLEPAGE</pagemaster>
                                <reportelements />
                            </paragraph>
                            <paragraph name="1.2.2 paragraph">
                                <pagemaster>DIN-A4-PREFACE</pagemaster>
                                <reportelements />
                            </paragraph>

我有问题的xsl通话是

<xsl:for-each-group select=".//reportelements/*[pagemaster != '']" group-adjacent="pagemaster">

    <fo:page-sequence master-reference="{current-grouping-key()}">
        <xsl:for-each select="current-group()">
            <fo:flow flow-name="xsl-region-body">
                <xsl:apply-templates select="."/>
            </fo:flow>
        </xsl:for-each>
    </fo:page-sequence>

</xsl:for-each-group>

这里的问题是,曾经为该组调用了应用模板

-1 section
  -1.1 picture
  -1.2 section
    -1.2.1 paragraph
    -1.2.2 paragraph

然后再次针对:

-1.2 section
    -1.2.1 paragraph
    -1.2.2 paragraph

因此,在1.2节的模板中有一个名为block id="{generate-id(.)}"block id="{generate-id(.)}"block id="{generate-id(.)}"被调用两次,并在生成pdf时导致错误。

我想要的是对每个元素单独调用apply模板,而对于子元素则不调用它。

您可能希望在以下方面有相同的变化:

<xsl:apply-templates select="node() except section" />

在其中选择所有子节点, 除了那些不会在当前组中的子节点。

严格来说,您需要一些可以测试当前组成员身份的东西,例如(未测试):

<xsl:apply-templates select="node()[. &lt;&lt; current-group()[last()]],
                             current-group()[last()]" />

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM