扩展 XSLT 模板以在处理期间不影响库存模板?
Extend an XSLT template to not effect stock templates during processing?
我不想修改许多套件附带的库存模板,而是想扩展库存模板,这样当库存模板获得 upgraded/updated 新版本时,我可以保留自己的 XSLT extension/modification 的库存 XSLT 并用于处理。功能类似于源代码补丁文件或 CSS 继承。
例如,如果常用 XSLT 在处理为 HTML 时在脚注之间的分隔中没有足够的 spaces,我想为该脚注添加我自己的 XSLT添加一个 space.
是的,XSLT 是可行的。争取 <xsl:apply-imports/>
.
A template rule that is being used to override another template rule (see 6.4 Conflict Resolution for Template Rules) can use the xsl:apply-imports or xsl:next-match instruction to invoke the overridden template rule.
在 DocBook XSL 样式表中,要创建的术语称为 “customization layer”。
基本思路是,将您的自定义设置放在 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 没有提供比这更多的更改粒度——例如,你不能让你的层只包含模板的一部分的两行补丁。您必须复制整个模板。
这样做的结果是,如果上游维护者 change/fix 您复制了原始模板的其他部分,您的自定义层将不会接受该更改,除非您重新复制新的再次进入上游模板并再次对其进行调整。
但这在实践中可能不会给您带来任何问题,因为最近我认为上游 DocBook XSL 模板不会经常更改。
另请注意,DocBook XSL 样式表中的某些模板巨大—因此即使您只需要制作单个图层,您的图层最终也会成为一个相对较大的文件-线补丁
我不想修改许多套件附带的库存模板,而是想扩展库存模板,这样当库存模板获得 upgraded/updated 新版本时,我可以保留自己的 XSLT extension/modification 的库存 XSLT 并用于处理。功能类似于源代码补丁文件或 CSS 继承。
例如,如果常用 XSLT 在处理为 HTML 时在脚注之间的分隔中没有足够的 spaces,我想为该脚注添加我自己的 XSLT添加一个 space.
是的,XSLT 是可行的。争取 <xsl:apply-imports/>
.
A template rule that is being used to override another template rule (see 6.4 Conflict Resolution for Template Rules) can use the xsl:apply-imports or xsl:next-match instruction to invoke the overridden template rule.
在 DocBook XSL 样式表中,要创建的术语称为 “customization layer”。
基本思路是,将您的自定义设置放在 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 没有提供比这更多的更改粒度——例如,你不能让你的层只包含模板的一部分的两行补丁。您必须复制整个模板。
这样做的结果是,如果上游维护者 change/fix 您复制了原始模板的其他部分,您的自定义层将不会接受该更改,除非您重新复制新的再次进入上游模板并再次对其进行调整。
但这在实践中可能不会给您带来任何问题,因为最近我认为上游 DocBook XSL 模板不会经常更改。
另请注意,DocBook XSL 样式表中的某些模板巨大—因此即使您只需要制作单个图层,您的图层最终也会成为一个相对较大的文件-线补丁