覆盖每个xslt

时间:2012-07-30 13:04:53

标签: xml xslt

我有一个xml文件,让我们说:

<parent>
    <notimportant1>
    </notimportant1>.    
    <notimportant2>
    </notimportant2>.   
     ....
    <child>
        <grandchild>.   
         ....
        </grandchild>
        <grandchild>
         ....
        </grandchild>. 
         ....
        <notimportant3>
        </notimportant3>
    </child>
<parent>
 

还有xsl文件:

<xsl:template match="parent">.   
      ...
      ...
     <xsl:for-each select="child">.    
         <xsl:for-each select="grandchild">
          ...
         </xsl:for-each>.    
     </xsl:for-each>
      ....
</xsl:template>

现在,我必须创建新的xsl文件, 只能导入/包含此现有xsl

是否可以覆盖此for-each行为,而不是它,我只能显示一些预定义的文本/链接?

我无法修改现有的xsl,我想使用模板中的其他所有内容 - 不能只定义具有更高优先级的新内容。

2 个答案:

答案 0 :(得分:5)

您可以重新设计原始样式表,以使用xsl:apply-templates代替xsl:for-each。像这样:

<xsl:template match="parent">
  ...   
  ...
  <xsl:apply-templates select="child"/>
  ....
</xsl:template>

<xsl:template match="child">
   <xsl:apply-templates select="grandchild"/>    
</xsl:template>

<xsl:template match="grandchild">
   ...
</xsl:template>

然后,当您在另一个样式表中导入此样式表时,您可以根据需要覆盖与childgrandchild匹配的模板。

答案 1 :(得分:2)

这里的策略是定义匹配parent的第二个模板,以确保导入的模板永远不会运行(因为您不能更改导入的模板,也不能在匹配后抑制其行为)。

默认情况下,导入的模板比原生模板具有更低的优先级,因此只需定义另一个模板即可解决此问题。

您还可以通过为模板提供priority属性来控制优先级。它越高,匹配节点集的可能性越大(意味着优先级较低的节点集)。

模板模式也是一种选择,但我认为你已经足够继续这里了。

XML Transforms - xsl:template (priority)

XSLT Element