如何在函数中<fo:table>的一部分



我必须在一个<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>

最新更新