2012-07-23 99 views
0

使用外部XSLT我要导入的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

模板总是比进口的样式模板更高的优先级。为了避免调用导入的模板,只需在必要的情况下在主要模板中覆盖它们即可。

这应该是优选的技术。替代方案是:

  1. 确定存在潜在冲突的匹配模式。
  2. 使用模式来区分两者。
  3. 当你与< XSL调用您的模板:应用模板>上选择哪些适合你的标识重叠模式之一,使用适当的模式(或无模式)来实现你想要的结果(主模板与进口模板) 。
+1

@wst如果添加的进口(主要)样式的身份转换,导入模板永远不会叫,除非你明确地调用进口使用xsl:apply-imports的模板。 – grtjn 2013-01-22 08:38:52

1

使用modes

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

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

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

不幸的是,docbook.xsl是一个包含多个文件和数百个模板的大型模块,因此无法轻松修改以适应模式。我尝试重新编译所有文件,将模式添加到所有模板中,但是它引发了更多问题。 – wst 2012-07-24 18:00:38

+0

@wst,然后使用* primary *样式表模块中的模式。 – 2012-07-24 18:12:48