- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我目前有一个 XSL 文件,用于将 XML 转换为 FO 格式 (XSL-FO)。唯一的问题是页脚。我需要显示从每个页面的页脚到其他页面之一的文本引用。这意味着我需要使页脚文本动态化。例如,这是每个页面的一些摘要文本:
page 1: Topic A
page 2: Topic B
page 3: Topic C, Subtopic of A
page 4: Topic D, Subtopic of A
page 5: Topic E, Subtopic of B
将“子主题”部分想象成要为每个页面显示的页脚。
考虑以下 XML:
<DATA_DS>
<LIST_ITEMS>
<ITEMS>
<isChild>0</isChild>
<myvalue>abc</myvalue>
<isLastChild>0</isLastChild>
</ITEMS>
<ITEMS>
<isChild>1</isChild>
<myvalue>def</myvalue>
<isLastChild>0</isLastChild>
</ITEMS>
<ITEMS>
<isChild>1</isChild>
<myvalue>ghi</myvalue>
<isLastChild>0</isLastChild>
</ITEMS>
<ITEMS>
<isChild>1</isChild>
<myvalue>xyz</myvalue>
<isLastChild>1</isLastChild>
</ITEMS>
</LIST_ITEMS>
</DATA_DS>
和这个 XSL:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<fo:root>
<fo:layout-master-set>
<fo:simple-page-master master-name="parentLOBPage-master" page-width="11in" page-height="8.5in" margin-left="1.3in" margin-right="0.65in" margin-top="0.35in" margin-bottom="0.35in">
<fo:region-body region-name="body" margin-top="0.5in" margin-right="0.65in"/>
<fo:region-after region-name="footer" extent="14mm" />
</fo:simple-page-master>
<fo:simple-page-master master-name="childLOBPage-master" page-width="11in" page-height="8.5in" margin-left="1.3in" margin-right="0.65in" margin-top="0.35in" margin-bottom="0.35in">
<fo:region-body region-name="body" margin-top="0.5in" margin-right="0.65in"/>
<fo:region-after region-name="footer" extent="14mm"/>
</fo:simple-page-master>
<fo:page-sequence-master master-name="parentLOBPage">
<fo:repeatable-page-master-reference
master-reference="parentLOBPage-master"/>
</fo:page-sequence-master>
<fo:page-sequence-master master-name="childLOBPage">
<fo:repeatable-page-master-reference
master-reference="childLOBPage-master"/>
</fo:page-sequence-master>
</fo:layout-master-set>
<xsl:apply-templates/>
</fo:root>
</xsl:template>
<xsl:template match="DATA_DS">
<xsl:for-each-group select="LIST_ITEMS/ITEMS"
group-adjacent="isChild">
<xsl:choose>
<xsl:when test="isChild = 0">
<fo:page-sequence master-reference="parentLOBPage">
<fo:static-content flow-name="footer">
<fo:table width="100%" table-layout="fixed" margin-top="5mm">
<fo:table-column column-width="80%"/>
<fo:table-column column-width="20%"/>
<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:block text-align="left" font-family="Arial" font-size="7pt" font-weight="normal">parent footer</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block text-align="right" font-family="Arial" font-size="7pt" font-weight="normal">Page <fo:page-number/> of <fo:page-number-citation ref-id="last-page" /></fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:static-content>
<fo:flow flow-name="body">
<xsl:for-each select="current-group()">
<xsl:apply-templates select="."/>
</xsl:for-each>
</fo:flow>
</fo:page-sequence>
</xsl:when>
<xsl:otherwise>
<fo:page-sequence master-reference="childLOBPage">
<fo:static-content flow-name="footer">
<fo:table width="100%" table-layout="fixed" margin-top="5mm">
<fo:table-column column-width="80%"/>
<fo:table-column column-width="20%"/>
<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:block text-align="left" font-family="Arial" font-size="7pt" font-weight="normal">child footer: <xsl:value-of select="myvalue"/></fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block text-align="right" font-family="Arial" font-size="7pt" font-weight="normal">Page <fo:page-number/> of <fo:page-number-citation ref-id="last-page" /></fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:static-content>
<fo:flow flow-name="body">
<xsl:for-each select="current-group()">
<xsl:apply-templates select="."/>
</xsl:for-each>
<fo:block id="last-page"/>
</fo:flow>
</fo:page-sequence>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
</xsl:template>
<xsl:template match="ITEMS">
<fo:table width="100%" table-layout="fixed" margin-top="5mm">
<fo:table-column column-width="20%"/>
<fo:table-column column-width="80%"/>
<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:block text-align="left" font-family="Arial" font-size="10pt" font-weight="bold">big table</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block text-align="left" font-family="Arial" font-size="10pt" font-weight="bold">some stuff</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
<xsl:if test="isChild = 1 and isLastChild = 0">
<fo:block page-break-after="always"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
由于我将每个页面的大部分内容包装在一个 fo:table 中,并且一些表格溢出到 2+ 页,我不能只在每个表格之后放置“动态页脚文本”,因为它不会显示在然后每一页。
所以,我想我对 fo:static-content 的使用是不合适的,即使它满足了我动态显示页码(即第 x 页,共 y 页)的需要。输出显示对于每个子页脚页面,显示的值为“def”,这是列表中的第一个“子”。因此,fo:static-content 会在第一次执行时自行填充,并且不会为后续页面更新……所以我的方法是错误的。我需要一些关于如何修改我的方法的指导......
关于如何让页脚按照我的 XSL-FO 情况所需的方式工作,有什么建议吗?谢谢...
最佳答案
您的代码结构不适合静态内容中的动态内容。
您缺少的概念是您的页脚需要“检索标记”,这些标记是您在流程中即时设置的。所有页面的一个页脚从页面内容中检索一个标记类,您在流中的点更改标记,检索获取最新的标记(或其他选项)。
因此,您只需要一个具有“Page x of y”位的页脚,并且您需要包含一个用于检索特定类标记的页脚。然后,在您的流程中,使用您的所有主题和子主题,当您到达每个主题的第一个项目时,您定义一个标记,其中包含您希望在页脚中看到的文本。
XSLT 需要生成的 XSL-FO 输出如下:
<fo:static-content>
... page x of y stuff ...
<fo:retrieve-marker retrieve-class-name="topic"/>
</fo:static-content>
<fo:flow>
<fo:table>
...
<fo:table-cell>
<fo:marker marker-class-name="topic">Topic A</fo:marker>
...
<fo:table-cell>
<fo:marker marker-class-name="topic">Topic B</fo:marker>
...
<fo:table-cell>
<fo:marker marker-class-name="topic">Topic C, Subtopic of A</fo:marker>
...
<fo:table-cell>
<fo:marker marker-class-name="topic">Topic D, Subtopic of A</fo:marker>
...
<fo:table-cell>
<fo:marker marker-class-name="topic">Topic E, Subtopic of B</fo:marker>
我建议您查看我的 PDF 图书免费“试用和购买”预览的第 257 页开始的标题为“静态内容中的动态内容”的框架:
http://www.CraneSoftwrights.com/training/#pfux
那里描述的标记的检索和定位属性有细微差别,并附有图表。
关于xml - 静态内容但动态内容中的 XSL-FO 页脚?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17456524/
我是一名优秀的程序员,十分优秀!