我有一个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,我想使用模板中的其他所有内容 - 不能只定义具有更高优先级的新内容。
答案 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>
然后,当您在另一个样式表中导入此样式表时,您可以根据需要覆盖与child
或grandchild
匹配的模板。
答案 1 :(得分:2)
这里的策略是定义匹配parent
的第二个模板,以确保导入的模板永远不会运行(因为您不能更改导入的模板,也不能在匹配后抑制其行为)。
默认情况下,导入的模板比原生模板具有更低的优先级,因此只需定义另一个模板即可解决此问题。
您还可以通过为模板提供priority
属性来控制优先级。它越高,匹配节点集的可能性越大(意味着优先级较低的节点集)。
模板模式也是一种选择,但我认为你已经足够继续这里了。