我必须在一个<fo:table-body>
中创建许多<fo:table-row>
。我认为,如果我多次(也许50次(写近5行代码来创建行,那就不太好了。
像这样:
<fo:table-body>
<fo:table-row>
<fo:table-cell padding-bottom="6pt">
<fo:value-of select="row1"/>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell padding-bottom="6pt">
<fo:value-of select="row2"/>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell padding-bottom="6pt">
<fo:value-of select="row3"/>
</fo:table-cell>
</fo:table-row>
....
</fo:table-body>
我试图编写一个函数,该函数编写<fo:表格行>我每次都要调用这个函数并传递一个参数。
<xsl:function name="fn:createRow">
<xsl:param name="string1"/>
<fo:table-row>
<fo:table-cell padding-bottom="6pt">
<fo:value-of select="$string1"/>
</fo:table-cell>
</fo:table-row>
</xsl:function>
现在我的XSLT是这样的。
<fo:table-body>
<fo:block>
<fo:value-of select="fn:createRow('row1')"/>
<fo:value-of select="fn:createRow('row2')"/>
</fo:block>
</fo:table-body>
但我得到了错误:
";fo:块";不是"的有效子代;fo:表体">
但是当我在没有<fo:block>我在PDF:中一无所获
<fo:table-body>
<fo:value-of select="fn:createRow('row1')"/>
<fo:value-of select="fn:createRow('row2')"/>
</fo:table-body>
有机会做这件事吗?
谢谢!
fo:table-cell
可以包含一个或多个块级FO,包括fo:block
。(请参见https://www.w3.org/TR/xsl11/#fo_table-细胞(
您不显示XML,但如果所有row*
元素都包含在一个元素中,那么在该元素的模板中,您可以执行以下操作:
<fo:table>
<fo:table-body>
<xsl:for-each select="*">
<fo:table-row>
<fo:table-cell padding-bottom="6pt">
<fo:block>
<!-- The row* element is the current element here. -->
<xsl:apply-templates />
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:for-each>
</fo:table-body>
</fo:table>
或者,您可以为所有row*
元素制作一个模板:
<xsl:template match="*[starts-with(local-name(), 'row')]">
<fo:table-row>
...
(从这个角度来看,不清楚为什么行元素需要单独的元素名称。(
当您知道要格式化的元素的名称时,您可以执行:
<xsl:apply-templates select="row1, row2, row3" />
和:
<xsl:template match="row1 | row2 | row3">
<fo:table-row>
...
我认为您需要的不是<fo:value-of select="$string1"/>
,而是<xsl:value-of select="$string1"/>
。我还将检查fo:table-cell
是否允许内联内容,可能需要在具有xsl:value-of
元素作为子元素的单元格中放置fo:block
容器。
此外,对于函数调用,不要使用<fo:value-of select="fn:createRow('row1')"/>
,而是使用<xsl:sequence select="fn:createRow('row1')"/>
。
此外,fn
是一个保留前缀,用于您自己的函数声明和使用您自己的命名空间(例如xmlns:mf="http://example.com/mf"
和<xsl:function name="mf:createRow" ...>...</xsl:function>
,然后使用<xsl:sequence select="mf:createRow('row1')"/>
。
所以这个函数的一个例子就是
<xsl:function name="mf:createRow">
<xsl:param name="input"/>
<fo:table-row>
<fo:table-cell padding-bottom="6pt">
<fo:block>
<xsl:value-of select="$input"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:function>
你可以称之为
<fo:table-body>
<xsl:sequence select="(1 to 3) ! ('Row ' || . ) ! mf:createRow(.)"/>
</fo:table-body>