模板“继承”

时间:2014-03-18 15:12:46

标签: .net xml xslt inheritance xslt-1.0

我的XSL中有两个模板,它们都应用于同一节点,但一个比另一个更具体

e.g。对于这个xml

<root>
  <a/>
  <a attr="1" attr2="2"/>
</root>

和这个xsl:

<xsl:template match="a">
  base template
</xsl:template>
<xsl:template match="a[@attr]">
  specific
</xsl:template>

通常,XSL将仅应用其中一个模板。 但是,在我更具体的模板中,我还想应用不太具体的模板中的所有内容。

3 个答案:

答案 0 :(得分:3)

XSLT 2.0为此目的具有<xsl:next-match/> instruction,但在1.0中,唯一的通用选项是将特定于较少的模板放在单独的XSLT文件中<xsl:import>,然后使用{{1} }。如果您确切地知道哪个&#34;不太具体的模板&#34;您想要使用的替代方法是为该模板提供<xsl:apply-imports/>以及name,然后使用match调用它,但绕过匹配机制 - 您必须决定使用哪个模板你是压倒性的,而不是让发动机找到&#34;次佳的&#34;。

答案 1 :(得分:0)

“继承”在XSLT中没有明确的含义。继承是一种面向对象的概念,适用于类和对象 - 在功能范例中不存在。

没有xsl:apply-templates属性的select 会应用与当前节点相同的其他模板。

相反,它指示XSLT处理器处理剩余的输入节点,并为处理器选择适当的模板。换句话说,这不会导致同一节点被处理两次。

现在,请考虑以下样式表(基本上是您的解决方案):

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="a">
        base template
    </xsl:template>

    <xsl:template match="a[@attr]">
        <xsl:apply-templates/>
        specific
    </xsl:template>

</xsl:stylesheet>

在模板匹配a[@attr]的上下文中,<xsl:apply-templates/>表示:

  

处理当前节点的所有可用子节点(所有元素*,processing-instruction(),comment(),所有属性@ *,text())。

在您的输入XML中,只有一个a节点与此模板匹配。它只有属性节点,默认情况下不输出。


  

通常,XSL将仅应用其中一个模板。但是,在我更具体的模板中,我还想应用不太具体的模板中的所有内容。

有几种解决方案(例如,在命名模板中存储可重用内容并调用它,导入外部样式表,使用变量,使用模板优先级,使用xsl:choose)。但首先你必须透露what exactly you'd like to achieve

答案 2 :(得分:-3)

这个答案不正确

使用

<xsl:apply-templates/>
没有select属性的

应用与当前节点匹配的其他模板

这个XSL:

<xsl:template match="a">
  base template
</xsl:template>
<xsl:template match="a[@attr]">
  <xsl:apply-templates/>
  specific
</xsl:template>

产生以下输出:

base template
specific

如果有超过1个特定模板的链条如上所述,我还没有调查可能会发生什么。