fo:page-序列两列未出现在输出 XSL-FO 中
fo:page-sequence two column not appearing in output XSL-FO
我想为小 table 尝试两栏布局。我复制了现有的 simple-page-master 并添加了 column-count="2"
。 (为简洁起见,我不包括页眉或页脚。)如果我删除 fo:page-sequence
和 fo:flow
,该模板将按预期工作,否则我的输出中什么也得不到。我尝试用另一个模板替换 numIndex,但也失败了。
我正在使用天线屋。一如既往,我很感激任何建议。
<fo:simple-page-master master-name="body-page-two-col" xsl:use-attribute-sets="odd-page-atts">
<fo:region-body region-name="region-body" xsl:use-attribute-sets="body-atts" column-count="2"/>
</fo:simple-page-master>
<xsl:attribute-set name="odd-page-atts">
<xsl:attribute name="page-height">11in</xsl:attribute>
<xsl:attribute name="page-width">8.5in</xsl:attribute>
<xsl:attribute name="margin-top">1.5pc</xsl:attribute>
<xsl:attribute name="margin-bottom">1.5pc</xsl:attribute>
<xsl:attribute name="margin-left">1in</xsl:attribute>
<xsl:attribute name="margin-right">.5in</xsl:attribute>
</xsl:attribute-set>
<xsl:attribute-set name="body-atts">
<xsl:attribute name="margin-top">4.5pc</xsl:attribute>
<xsl:attribute name="margin-bottom">4.5pc</xsl:attribute>
</xsl:attribute-set>
<xsl:template name="numIndex">
<fo:page-sequence master-reference="body-page-two-col" initial-page-number="auto" format="1">
<fo:flow flow-name="region-body">
<fo:block>
<fo:table-and-caption>
<fo:table-caption>
<fo:block>
<xsl:text>Numerical Index</xsl:text>
</fo:block>
</fo:table-caption>
<fo:table>
<xsl:attribute name="id"><xsl:apply-templates select="ancestor::dmodule/identAndStatusSection/dmAddress/dmIdent/dmCode"/><xsl:text>tbl-numidx001</xsl:text></xsl:attribute>
<fo:table-header>
<fo:table-row>
<fo:table-cell>
<fo:block font-size="11pt" font-style="italic" >
<fo:retrieve-table-marker retrieve-class-name="continued-ni" retrieve-boundary-within-table="table"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-header>
<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:marker marker-class-name="continued-ni"/>
<fo:marker marker-class-name="continued-ni">
<fo:block text-align="center">Numerical Index  (Continued)
</fo:block>
</fo:marker>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:table border-bottom="solid" border-bottom-width=".5pt"
border-top="solid" border-top-width=".5pt" font-size="8pt"
margin-bottom="8pt" margin-left="3pt" margin-right="3pt" margin-top="8pt"
relative-position="static" space-after.maximum="12pt" space-after.minimum="12pt"
space-after.optimum="12pt" space-before.maximum="14pt" space-before.minimum="12pt"
space-before.optimum="12pt" span="all" table-layout="fixed" table-omit-header-at-break="false"
table-omit-footer-at-break="true" text-align="start" white-space-treatment="preserve"
width="3.0in" hyphenate="true" cols="4">
<fo:table-column column-number="1" column-width="30%"/>
<fo:table-column column-number="2" column-width="20%"/>
<fo:table-column column-number="3" column-width="20%"/>
<fo:table-column column-number="4" column-width="20%"/>
<fo:table-header>
<xsl:call-template name="NI-HEADER"/>
</fo:table-header>
<fo:table-body>
<xsl:call-template name="SortParts"/>
</fo:table-body>
</fo:table>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:table-and-caption>
</fo:flow>
</fo:block>
</fo:page-sequence>
</xsl:template>
这就是所谓的 numIndex:
<xsl:template match="illustratedPartsCatalog">
<xsl:apply-templates />
<xsl:call-template name="numIndex"/>
</xsl:template>
我可以看到 2 个问题:
您已为 fo:table 指定了 width="7.0in"
,因此它无法放入比这更窄的列中。您的列只有 3.5" 减去列之间的列间距(如果您没有另外指定,则为 12pt)。table 将流向第一个宽度足以容纳它们的正文页面。
template match="illustratedPartsCatalog"
首先做一个应用模板。如果生成页面序列但不关闭它,call-template name="numIndex"
将尝试创建嵌套页面序列,但这将不起作用。
FO 模板以 </fo:layout-master-set>
开头。
那么有两种方法可以进行:可以使用template match="node"
匹配XML中根节点的每个子节点,也可以使用xsl:call-template
命令。这为您提供了更大的灵活性,您可以构建一个模板,该模板生成一个页面序列,其中包含根节点的多个子节点。
所以你可以这样做:
<xsl:call-template name="insertIllustratedPartsCatalog"/>
<xsl:call-template name="numIndex"/>
其中 insertIllustratedPartsCatalog
为零件目录创建页面序列,numIndex
为索引创建页面序列。
(如果没有看到整个 FO 模板,很难得到比这更具体的信息)。
如果我没理解错的话,您想要一个 table 在您的常规单列流程中流入两列。由于您使用的是 AH Formatter,因此可以使用两列 fo:block-container
来仅包含 table。参见 https://www.antennahouse.com/product/ahf64/ahf-ext.html#axf.column-count。但是,这不会让您成为“(继续)”标记。为此,您可以将 fo:block-container
作为外部 fo:table
.
的 fo:table-cell
的子级
但是,由于我完全不确定我是否理解您的要求,您能否对您正在寻找的内容做一个简单的图示说明?
此外,如果如您在代码示例中所示,fo:simple-page-master
在任何 xsl:template
之外,它将被 XSLT 处理器忽略并且不会出现在您的 FO 文件中。
根据https://www.w3.org/TR/xslt#stylesheet-element:
an XSLT processor is always free to ignore such top-level elements, and must ignore a top-level element without giving an error if it does not recognize the namespace URI.
我想为小 table 尝试两栏布局。我复制了现有的 simple-page-master 并添加了 column-count="2"
。 (为简洁起见,我不包括页眉或页脚。)如果我删除 fo:page-sequence
和 fo:flow
,该模板将按预期工作,否则我的输出中什么也得不到。我尝试用另一个模板替换 numIndex,但也失败了。
我正在使用天线屋。一如既往,我很感激任何建议。
<fo:simple-page-master master-name="body-page-two-col" xsl:use-attribute-sets="odd-page-atts">
<fo:region-body region-name="region-body" xsl:use-attribute-sets="body-atts" column-count="2"/>
</fo:simple-page-master>
<xsl:attribute-set name="odd-page-atts">
<xsl:attribute name="page-height">11in</xsl:attribute>
<xsl:attribute name="page-width">8.5in</xsl:attribute>
<xsl:attribute name="margin-top">1.5pc</xsl:attribute>
<xsl:attribute name="margin-bottom">1.5pc</xsl:attribute>
<xsl:attribute name="margin-left">1in</xsl:attribute>
<xsl:attribute name="margin-right">.5in</xsl:attribute>
</xsl:attribute-set>
<xsl:attribute-set name="body-atts">
<xsl:attribute name="margin-top">4.5pc</xsl:attribute>
<xsl:attribute name="margin-bottom">4.5pc</xsl:attribute>
</xsl:attribute-set>
<xsl:template name="numIndex">
<fo:page-sequence master-reference="body-page-two-col" initial-page-number="auto" format="1">
<fo:flow flow-name="region-body">
<fo:block>
<fo:table-and-caption>
<fo:table-caption>
<fo:block>
<xsl:text>Numerical Index</xsl:text>
</fo:block>
</fo:table-caption>
<fo:table>
<xsl:attribute name="id"><xsl:apply-templates select="ancestor::dmodule/identAndStatusSection/dmAddress/dmIdent/dmCode"/><xsl:text>tbl-numidx001</xsl:text></xsl:attribute>
<fo:table-header>
<fo:table-row>
<fo:table-cell>
<fo:block font-size="11pt" font-style="italic" >
<fo:retrieve-table-marker retrieve-class-name="continued-ni" retrieve-boundary-within-table="table"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-header>
<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:marker marker-class-name="continued-ni"/>
<fo:marker marker-class-name="continued-ni">
<fo:block text-align="center">Numerical Index  (Continued)
</fo:block>
</fo:marker>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:table border-bottom="solid" border-bottom-width=".5pt"
border-top="solid" border-top-width=".5pt" font-size="8pt"
margin-bottom="8pt" margin-left="3pt" margin-right="3pt" margin-top="8pt"
relative-position="static" space-after.maximum="12pt" space-after.minimum="12pt"
space-after.optimum="12pt" space-before.maximum="14pt" space-before.minimum="12pt"
space-before.optimum="12pt" span="all" table-layout="fixed" table-omit-header-at-break="false"
table-omit-footer-at-break="true" text-align="start" white-space-treatment="preserve"
width="3.0in" hyphenate="true" cols="4">
<fo:table-column column-number="1" column-width="30%"/>
<fo:table-column column-number="2" column-width="20%"/>
<fo:table-column column-number="3" column-width="20%"/>
<fo:table-column column-number="4" column-width="20%"/>
<fo:table-header>
<xsl:call-template name="NI-HEADER"/>
</fo:table-header>
<fo:table-body>
<xsl:call-template name="SortParts"/>
</fo:table-body>
</fo:table>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:table-and-caption>
</fo:flow>
</fo:block>
</fo:page-sequence>
</xsl:template>
这就是所谓的 numIndex:
<xsl:template match="illustratedPartsCatalog">
<xsl:apply-templates />
<xsl:call-template name="numIndex"/>
</xsl:template>
我可以看到 2 个问题:
您已为 fo:table 指定了
width="7.0in"
,因此它无法放入比这更窄的列中。您的列只有 3.5" 减去列之间的列间距(如果您没有另外指定,则为 12pt)。table 将流向第一个宽度足以容纳它们的正文页面。template match="illustratedPartsCatalog"
首先做一个应用模板。如果生成页面序列但不关闭它,call-template name="numIndex"
将尝试创建嵌套页面序列,但这将不起作用。
FO 模板以 </fo:layout-master-set>
开头。
那么有两种方法可以进行:可以使用template match="node"
匹配XML中根节点的每个子节点,也可以使用xsl:call-template
命令。这为您提供了更大的灵活性,您可以构建一个模板,该模板生成一个页面序列,其中包含根节点的多个子节点。
所以你可以这样做:
<xsl:call-template name="insertIllustratedPartsCatalog"/>
<xsl:call-template name="numIndex"/>
其中 insertIllustratedPartsCatalog
为零件目录创建页面序列,numIndex
为索引创建页面序列。
(如果没有看到整个 FO 模板,很难得到比这更具体的信息)。
如果我没理解错的话,您想要一个 table 在您的常规单列流程中流入两列。由于您使用的是 AH Formatter,因此可以使用两列 fo:block-container
来仅包含 table。参见 https://www.antennahouse.com/product/ahf64/ahf-ext.html#axf.column-count。但是,这不会让您成为“(继续)”标记。为此,您可以将 fo:block-container
作为外部 fo:table
.
fo:table-cell
的子级
但是,由于我完全不确定我是否理解您的要求,您能否对您正在寻找的内容做一个简单的图示说明?
此外,如果如您在代码示例中所示,fo:simple-page-master
在任何 xsl:template
之外,它将被 XSLT 处理器忽略并且不会出现在您的 FO 文件中。
根据https://www.w3.org/TR/xslt#stylesheet-element:
an XSLT processor is always free to ignore such top-level elements, and must ignore a top-level element without giving an error if it does not recognize the namespace URI.