仅对某些模板使用外部XSLT

时间:2012-07-23 19:33:08

标签: xml xslt stylesheet docbook

我想导入一个XSLT样式表,但实际上默认情况下会忽略它,并且只在调用时才使用它的模板。

我们的内容包含自定义XML + DocBook样式表,因此它目前由两个XSLT转换:XML => my.xsl => docbook.xsl => XHTML。是否有可能从my.xsl完成所有这些?

<!-- My XML -->
<xsl:template match="a"/>
<xsl:template match="b"/>
<xsl:template match="c"/>

<!-- DocBook XML -->
<xsl:template match="table">
  <xsl:apply-templates select="." mode="docbook"/>
</xsl:template>

导入docbook.xsl样式表的问题在于它包含许多干扰现有模板的其他模板。理想情况下,有一种方法可以将docbook.xsl导入指定模式,但这是不可能的。有没有办法在不修改docbook.xsl的情况下执行此操作?

2 个答案:

答案 0 :(得分:2)

主样式表中的模板始终具有比导入样式表中的模板更高的优先级。要避免调用导入的模板,只需在主要情况下在必要的情况下覆盖它们。

这应该是首选技术。另一种选择是:

  1. 确定存在潜在冲突的匹配模式。
  2. 使用模式区分两者。
  3. 使用&lt; xsl:apply-templates&gt;调用模板时在符合您确定的重叠模式之一的选择上,使用适当的模式(或无模式)来实现预期结果(主模板与导入模板)。

答案 1 :(得分:1)

使用modes

在导入的样式表中,所有模板都处于具有唯一名称且无人使用的模式中。例如,使用prefix:mymode并将前缀prefix绑定到属于您的命名空间。

要从导入的样式表调用处理,请使用

<xsl:apply-templates select="$vNodesToBeProcessed" mode="prefix:mymode"/>