xslt - XSL-FO:如何通过属性控制每个元素使用哪个 simple-page-master?
问题描述
我想将 simple-page-master 名称添加到 xml 中应该用于该元素的每个元素。具有相同简单页面母版的连续元素应连续呈现。具有不同简单页面母版作为属性的元素应该在新页面上开始。
每个元素都应负责其简单的页面主控。
根据需要动态更改 我已经尝试过的simple-page-master的master-name
...
<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 元素嵌套在多个层次结构中,我没有得到我需要的深度。
这些是我的例子 simple-page master
<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>
那么我认为你应该得到你想要的“页面”结构,我不确定需要输出哪些内容以及是否需要保留一些嵌套,上面会以某种方式将嵌套输入展平为一些平面输出
推荐阅读
- mysql - 'null'、'last_insert_id()'、'true' 等是否需要准备好的语句,即使它们实际上不是用户输入?
- c# - C# windows 窗体导出到 excel 在我的系统上工作正常,但不能导出到任何其他系统
- reactjs - react-static: Promise 在 IE11 上未定义
- c++ - 如何使用 CGI 流式传输运动 jpeg?
- python-3.x - 如何在matplotlib中使用对数刻度指定次要刻度位置而不进行标记?
- machine-learning - 使用均值偏移对图像块进行泛化?
- angular - 角材料表可扩展表行不扩展?
- jasper-reports - 在jasper报告中打印pdf时加粗文本
- apache - Tomcat 可能未启动或正在侦听错误的端口 (errno=13)
- c++ - 在不滥用 CMAKE_CXX_FLAGS 和 CMAKE_C_FLAGS 的情况下为单个目标设置 c-compiler 和 c++-compiler 标志