XSL-FO:如何通过属性控制每个元素使用哪个 simple-page-master?

XSL-FO: How can I control which simple-page-master is used for each element via attributes?

我想将 simple-page-master 名称添加到 xml 中应该用于该元素的每个元素。 具有相同简单页面母版的连续元素应连续呈现。 具有不同的简单页面母版作为属性的元素应该在新页面上开始。

每个元素都应该负责其简单的页面母版。

根据 我已经试过了

...
<xsl:apply-templates select="*" mode="pagemasterTemplate"/>

</fo:root>
    </xsl:template>   

    <xsl:template match="element" mode="pagemasterTemplate">
        <xsl:for-each-group select="*" group-adjacent="pagemaster">
            <fo:page-sequence>
                <xsl:attribute name="master-reference"><xsl:value-of select ="pagemaster"/></xsl:attribute>
                <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>
    </xsl:template>

但是我的 XML 元素嵌套在多个层级中,我没有得到我需要的深度。

这些是我的例子简单页面大师

<fo:simple-page-master master-name="RED-PAGE">
    <fo:region-body backgound-color="red"/>
</fo:simple-page-master>

<fo:simple-page-master master-name="BLUE-PAGE">
    <fo:region-body backgound-color="blue"/>
</fo:simple-page-master>

<fo:simple-page-master master-name="YELLOW-PAGE">
    <fo:region-body backgound-color="yellow"/>
</fo:simple-page-master>

示例XML

<root>
  <report>
    <reportelements>
        <section name="sec 1">
            <pagemaster>RED-PAGE</pagemaster>
            <reportelements>
                <chapter name="cha 1.1">
                    <pagemaster>RED-PAGE</pagemaster>
                    <reportelements>
                        <paragraph name="par 1.1.1">
                            <reportelements/>
                            <pagemaster>RED-PAGE</pagemaster>
                        </paragraph>
                    </reportelements>
                </chapter>
            </reportelements>
        </section>
        <section name="sec 2">
            <pagemaster>BLUE-PAGE</pagemaster>
            <reportelements>
                <chapter name="cha 2.1">
                    <pagemaster>YELLOW-PAGE</pagemaster>
                    <reportelements>
                        <picture name="pic 2.1.1">
                            <reportelements/>
                            <pagemaster>YELLOW-PAGE</pagemaster>
                        </picture>
                    </reportelements>
                </chapter>
            </reportelements>
        </section>
    </reportelements>
  </report>
</root>

我想要的是如下所示的输出:

|‾‾‾‾‾‾‾‾‾‾‾‾‾‾|
|   RED-PAGE   | 
|   sec 1      |
|   cha 1.1    |
|   par 1.1.1  |
|              |
|              |
|              |
 ‾‾‾‾‾‾‾‾‾‾‾‾‾‾
|‾‾‾‾‾‾‾‾‾‾‾‾‾‾|
|   BLUE-PAGE  | 
|   sec 2      |
|              |
|              |
|              |
|              |
|              |
 ‾‾‾‾‾‾‾‾‾‾‾‾‾‾
|‾‾‾‾‾‾‾‾‾‾‾‾‾‾|
|  YELLOW-PAGE | 
|   cha 2.1    |
|   pic 2.1.1  |
|              |
|              |
|              |
|              |
 ‾‾‾‾‾‾‾‾‾‾‾‾‾‾

如果您只是将 <xsl:apply-templates select="*" mode="pagemasterTemplate"/> 更改为

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

然后设置一个

<xsl:template match="element">
  <fo:block>
    <fo:block><xsl:value-of select="@name"/></fo:block>
  </fo:block>
</xsl:template>

那么我认为你应该得到你想要的"page"结构,我不确定哪些内容需要输出以及它是否需要保留一些嵌套,上面会以某种方式将嵌套输入展平为一些平输出