如何重用xsl-fo块?

时间:2014-03-04 13:54:46

标签: xslt xsl-fo

我正在维护一个xsl-fo文件。我既不擅长xslt,也不擅长xsl-fo,我每年只会触摸一次该文件。

我注意到该文件中存在大量重复内容。例如,我在不同的上下文中有两次这个确切的块(逐字):

                <xsl:if test="ReleaseNote!=''">
                  <fo:block background-color="#ffeeee" padding="5mm" font-size="12pt" text-indent="0" border-style="solid" border-width="1px" border-color="red">
                    <fo:table table-layout="fixed" width="100%">
                      <fo:table-column column-width="20mm" />
                      <fo:table-column column-width="135mm" />
                      <fo:table-body>
                        <fo:table-row>
                          <fo:table-cell margin="0" padding="0" text-align="justify">
                            <fo:block text-align="justify">

                              <fo:external-graphic src="pic/warning.png" content-width="12mm" content-height="12mm" />
                            </fo:block>
                          </fo:table-cell>
                          <fo:table-cell margin="0" padding="0">
                            <fo:block linefeed-treatment="preserve">
                              <xsl:value-of select="ReleaseNote" />
                            </fo:block>
                          </fo:table-cell>
                        </fo:table-row>
                      </fo:table-body>
                    </fo:table>
                  </fo:block>
                </xsl:if></fo:block>

如何删除此重复项?我可以预先定义此块,然后在xslt中重新使用它的“引用”吗?

1 个答案:

答案 0 :(得分:2)

您可以将其放在命名模板中。有关命名模板(尤其是参数)的详细信息,请参阅规范here的相关部分。

<xsl:template name="reusable-content">
   <xsl:if test="ReleaseNote!=''">
      <!--...-->
   </xsl:if>
</xsl:template>

然后,调用您需要内容的模板:

<xsl:call-template name="reusable-content"/>

命名模板的优点是保留了调用模板的上下文。换句话说,在原始代码中工作的任何XPath表达式在从命名模板中执行时也可以完美地工作。 这只有在代码依赖于上下文时才重要,正如您所做的那样:

<xsl:value-of select="ReleaseNote" />

上述说明依赖于ReleaseNote可用作子元素的上下文。


您问题的另一个解决方案是将可重复使用的内容存储在变量中。但是可能存在一些限制,特别是如果您使用XSLT 1.0(您没有透露您使用的是哪个版本)。