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"结构,我不确定哪些内容需要输出以及它是否需要保留一些嵌套,上面会以某种方式将嵌套输入展平为一些平输出
我想将 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"结构,我不确定哪些内容需要输出以及它是否需要保留一些嵌套,上面会以某种方式将嵌套输入展平为一些平输出