Расширить шаблон XSLT, чтобы он не влиял на стандартные шаблоны во время обработки?
Вместо того, чтобы изменять стандартные шаблоны, которые поставляются со многими наборами, я бы хотел расширить стандартные шаблоны, чтобы, когда стандартный шаблон обновлялся / обновлялся новой версией, я мог оставить свое собственное расширение XSLT / модификацию стандартного XSLT и использовать обрабатывать также. По функциям похож на файл патча исходного кода или наследование CSS.
Например, если в стандартном XSLT не хватает места для разделения сносок при обработке в HTML, я бы хотел добавить свой собственный XSLT для этой сноски, который добавляет пробел.
2 ответа
В DocBook XSL таблицы стилей, которые вы хотите создать, называются "уровнем настройки".
Основная идея, положить ваши настройки в customizations.xsl
или любой другой файл, а затем используйте выбранный вами движок XSLT, чтобы вызывать его вместо стандартного файла драйвера DocBook XSL; как это:
xsltproc customizations.xsl my-docbook-source.xml
Как далеко, что именно вы положили в customizations.xsl
файл, если все, что вы хотите изменить, это некоторые настраиваемые пользователем параметры DocBook XSL, это так же просто, как:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:import href="html/docbook.xsl"/>
<xsl:param name="html.stylesheet" select="'corpstyle.css'"/>
<xsl:param name="admon.graphics" select="1"/>
</xsl:stylesheet>
И если вам нужно заменить целый шаблон:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
version="1.0">
<xsl:import href="fo/docbook.xsl"/>
<xsl:template match="lineannotation">
<fo:inline font-style="italic">
<xsl:call-template name="inline.charseq"/>
</fo:inline>
</xsl:template>
</xsl:stylesheet>
Поэтому, вместо того, чтобы напрямую вызывать файл драйвера DocBook XSL из командной строки, вы вызываете customization.xsl
файл и он должен вызвать правильный драйвер DocBook XSL, а затем для href
значения, например, в <xsl:import href="html/docbook.xsl"/>
элементы, вам просто нужно указать путь к тому месту, где в вашей системе находится стандартный набор стилей DocBook XSL + драйвер.
Например, в системе Debian:
<xsl:import href="/usr/share/xml/docbook/stylesheet/docbook-xsl/html/docbook.xsl"/>
Предостережения
Если вам необходимо внести какие-либо изменения в один из шаблонов в стандартных таблицах стилей, скопируйте и вставьте весь шаблон в свой слой настройки и внесите в него изменения.
XSLT не дает большей степени детализации процесса внесения изменений - например, вы не можете, чтобы ваш слой содержал только двухстрочный патч для части шаблона. Вы должны скопировать весь шаблон.
Следствием этого является то, что если сопровождающие верхнего уровня изменят / исправят какую-то другую часть оригинального шаблона, копию которого вы сделали, ваш слой настройки не будет воспринимать это изменение, если вы снова не скопируете новый вышестоящий шаблон и не сделаете настраивается снова.
Но это, вероятно, не вызовет у вас никаких проблем на практике, потому что в наши дни я думаю, что исходные шаблоны DocBook XSL меняются не очень часто.
Также обратите внимание, что некоторые из шаблонов в таблицах стилей DocBook XSL огромны- поэтому ваш слой может оказаться относительно большим файлом, даже если вам нужно сделать только однострочное исправление
Да, это возможно для XSLT. Пойти на <xsl:apply-imports/>
,
Шаблонное правило, которое используется для переопределения другого шаблонного правила (см. 6.4 Разрешение конфликтов для правил шаблона), может использовать инструкцию xsl:apply-import или xsl:next-match для вызова переопределенного правила шаблона.