2014-03-04 52 views
3

我正在維護一個xsl-fo文件。我既不擅長xslt,也不在xsl-fo,每年我只接觸一次該文件。如何重新使用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

可能重複[如何在XSL中重複使用代碼](http://stackoverflow.com/questions/15711840/how-can-i-reuse-code-in-xsl) –

回答

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(您沒有透露您使用的是哪個版本)。