如何使用 XSL-FO/Apache FOP 在 table 行中重复相同的模板
How to repeat same template in table-row using XSL-FO/Apache FOP
我正在尝试从我已有的 XML 文件创建一个 PDF,目前为止使用 XSL-FO/Apache FOP 运行良好。
XML文件主要包含条码信息:条码本身和条码类型(我也会在某些时候添加条码图像)。
现在我希望看到的输出是这样的:
-----------------------
| barcode1 | barcode2 |
| codetype1 | codetype2 |
-----------------------
| barcode3 | barcode4 |
| codetype3 | codetype4 |
-----------------------
以此类推
我定义了以下 xsl:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" exclude-result-prefixes="fo">
<xsl:template match="barcode-list">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="simpleA4" page-height="29.7cm" page-width="21cm" margin-top="2cm" margin-bottom="2cm" margin-left="2cm" margin-right="2cm">
<fo:region-body/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="simpleA4">
<fo:flow flow-name="xsl-region-body">
<fo:block font-size="10pt">
<fo:table table-layout="fixed" width="100%" border-collapse="separate">
<fo:table-column column-width="45%"/>
<fo:table-column column-width="45%"/>
<fo:table-body>
<xsl:apply-templates select="item"/>
</fo:table-body>
</fo:table>
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
<xsl:template match="item">
<fo:table-row>
<fo:table-cell>
<fo:block wrap-option="wrap">
<xsl:value-of select="name"/>
</fo:block>
<fo:block wrap-option="wrap">
<xsl:value-of select="format"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:template>
</xsl:stylesheet>
所以有两列,我假设我可以将它指向 "item" 模板来填充单元格。
现在我意识到 "item" 模板包含一个 <table-row>
标记,这会导致每个项目出现在它自己的 table 行中。所以我得到的是:
-----------------------
| barcode1 | |
| codetype1 | |
-----------------------
| barcode2 | |
| codetype2 | |
-----------------------
| barcode3 | |
| codetype3 | |
-----------------------
| barcode4 | |
| codetype4 | |
-----------------------
我的问题是如何更改 xsl 以获得所需的输出而不是让每个项目都在其自己的 table 行中?
省略 fo:table-row
并使用很少使用的 starts-row
(https://www.w3.org/TR/xsl11/#starts-row) and/or ends-row
(https://www.w3.org/TR/xsl11/#ends-row) 属性:
<xsl:template match="item">
<fo:table-cell>
<xsl:if test="position() mod 2 = 1">
<xsl:attribute name="starts-row">true</xsl:attribute>
</xsl:if>
<fo:block wrap-option="wrap">
<xsl:value-of select="name"/>
</fo:block>
<fo:block wrap-option="wrap">
<xsl:value-of select="format"/>
</fo:block>
</fo:table-cell>
</xsl:template>
我正在尝试从我已有的 XML 文件创建一个 PDF,目前为止使用 XSL-FO/Apache FOP 运行良好。
XML文件主要包含条码信息:条码本身和条码类型(我也会在某些时候添加条码图像)。
现在我希望看到的输出是这样的:
-----------------------
| barcode1 | barcode2 |
| codetype1 | codetype2 |
-----------------------
| barcode3 | barcode4 |
| codetype3 | codetype4 |
-----------------------
以此类推
我定义了以下 xsl:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" exclude-result-prefixes="fo">
<xsl:template match="barcode-list">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="simpleA4" page-height="29.7cm" page-width="21cm" margin-top="2cm" margin-bottom="2cm" margin-left="2cm" margin-right="2cm">
<fo:region-body/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="simpleA4">
<fo:flow flow-name="xsl-region-body">
<fo:block font-size="10pt">
<fo:table table-layout="fixed" width="100%" border-collapse="separate">
<fo:table-column column-width="45%"/>
<fo:table-column column-width="45%"/>
<fo:table-body>
<xsl:apply-templates select="item"/>
</fo:table-body>
</fo:table>
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
<xsl:template match="item">
<fo:table-row>
<fo:table-cell>
<fo:block wrap-option="wrap">
<xsl:value-of select="name"/>
</fo:block>
<fo:block wrap-option="wrap">
<xsl:value-of select="format"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:template>
</xsl:stylesheet>
所以有两列,我假设我可以将它指向 "item" 模板来填充单元格。
现在我意识到 "item" 模板包含一个 <table-row>
标记,这会导致每个项目出现在它自己的 table 行中。所以我得到的是:
-----------------------
| barcode1 | |
| codetype1 | |
-----------------------
| barcode2 | |
| codetype2 | |
-----------------------
| barcode3 | |
| codetype3 | |
-----------------------
| barcode4 | |
| codetype4 | |
-----------------------
我的问题是如何更改 xsl 以获得所需的输出而不是让每个项目都在其自己的 table 行中?
省略 fo:table-row
并使用很少使用的 starts-row
(https://www.w3.org/TR/xsl11/#starts-row) and/or ends-row
(https://www.w3.org/TR/xsl11/#ends-row) 属性:
<xsl:template match="item">
<fo:table-cell>
<xsl:if test="position() mod 2 = 1">
<xsl:attribute name="starts-row">true</xsl:attribute>
</xsl:if>
<fo:block wrap-option="wrap">
<xsl:value-of select="name"/>
</fo:block>
<fo:block wrap-option="wrap">
<xsl:value-of select="format"/>
</fo:block>
</fo:table-cell>
</xsl:template>