我正在维护一个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中重新使用它的“引用”吗?
答案 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(您没有透露您使用的是哪个版本)。