Расширить шаблон 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 для вызова переопределенного правила шаблона.

W3 применять-импорт

Другие вопросы по тегам