Я веду файл 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?

3
Martin Ba 4 Мар 2014 в 17:54
 – 
Martin Ba
5 Мар 2014 в 00:43

1 ответ

Лучший ответ

Вы можете поместить это в именованный шаблон . Более подробная информация об именованных шаблонах (особенно о параметрах) в соответствующей части спецификации здесь .

<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 (вы не указали, какую версию вы используете).

3
Mathias Müller 4 Мар 2014 в 18:17