xsl apply-imports的范围是什么?

时间:2010-03-10 14:51:50

标签: xslt

我对apply-imports的最初想法是,如果有两个模板匹配同一个节点,那么在优先级较高的模板中使用apply-imports会运行优先级较低的模板。但我最近发现进口组织起来很重要。

有两件事特别让我感兴趣。

  • 是否会对导入文件中导入的模板(嵌套导入)应用导入工作?
  • “兄弟导入”怎么样(主文件导入两个模板匹配相同节点的文件)

在我看来,specification中没有明确说明这一点。有人可以提供权威指南吗?

编辑:我可以自己尝试这些案例,但总会存在特定于实现的行为的危险。

1 个答案:

答案 0 :(得分:1)

我不是XSLT专家(更多的是爱好者),但这是一个有趣的,迄今尚未回答的问题。我认为答案确实存在于规范中,但有点令人困惑,因为你需要弄清楚什么是后序遍历。

http://en.wikipedia.org/wiki/Tree_traversal

“导入优先级”树的规范中有一个例子:

http://www.w3.org/TR/xslt#dt-import-precedence

  

例如,假设

     
      
  • stylesheet A按顺序导入样式表B和C;
  •   
  • stylesheet B导入样式表D;
  •   
  • stylesheet C导入样式表E。
  •   
     

然后是导入优先顺序   (最低的第一个)是D,B,E,C,A。

您需要了解订单后遍历,以便了解样式表为何具有此导入优先顺序。维基百科将后序遍历描述为“左,右,根”。

通常,具有较高导入优先级的定义或模板规则优先于具有较低导入优先级的定义或模板规则。

回到你的具体问题:

  • 是否会对导入文件中导入的模板(嵌套导入)应用导入工作?

我的猜测是肯定的(根据优先顺序),如果你从相应的匹配模板中调用它们,它甚至会调用多个模板。如下所述:

http://www.w3.org/TR/xslt#element-apply-imports

  

例如,假设样式表   doc.xsl包含一个模板规则   示例元素:

<xsl:template match="example">
  <pre><xsl:apply-templates/></pre>
</xsl:template>
     

另一个样式表可以导入   doc.xsl并修改了治疗方法   示例元素如下:

<xsl:import href="doc.xsl"/>

<xsl:template match="example">
  <div style="border: solid red">
     <xsl:apply-imports/>
  </div>
</xsl:template>
     

综合效果将是   将示例转换为元素   形式:

<div style="border: solid red"><pre>...</pre></div>
  • “兄弟导入”怎么样(主文件导入两个模板匹配相同节点的文件)

匹配模板的选择将基于具有更高的导入优先级,这取决于导入顺序。

我的猜测是这样的:

  
      
  • stylesheet A按顺序导入样式表B和C;
  •   
     

然后导入优先顺序(最低的第一个)是B,C,A。

因此,在这种情况下,将选择样式表C中的模板。

  
      
  • stylesheet A按顺序导入样式表C和B;
  •   
     

然后导入优先顺序(最低的第一个)是C,B,A。

因此,在这种情况下,将选择样式表B中的模板。