Я веду файл 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 ответ
Вы можете поместить это в именованный шаблон . Более подробная информация об именованных шаблонах (особенно о параметрах) в соответствующей части спецификации здесь .
<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 (вы не указали, какую версию вы используете).
Похожие вопросы
Новые вопросы
xslt
XSLT - это язык преобразования XML, предназначенный для преобразования структурированных документов в другие форматы (например, XML, HTML и простой текст или, в XSLT 3, JSON). Вопросы должны использовать один из тегов xslt-1.0, xslt-2.0 или xslt-3.0 в зависимости от ситуации.