我们可以有多个match="/"的xsl:templates吗?

3
我们能够使用匹配为“/”且名称不同的多个xsl:templates吗?基本上,我想要遍历一个XML文件直到某个级别,然后如果满足某些条件,则从“ / ”开始重新进行遍历。因此,我考虑根据一些条件创建<xsl:call-template name="option-1"><xsl:call-template name="option-2"> ,其中option-1和option-2都将像<xsl:template match="/" name="option-1"><xsl:template match="/" name="option-2">一样。
如果有更好的方法,我也是开放的。我只想从根节点重新开始迭代。
1个回答

4
你要找的概念是模板模式。你可以定义不同的模板模式。
<xsl:template match="/" mode="option1">

同样地,option2 也是如此,以及您最初的起始模板没有任何模式

<xsl:template match="/">
  <xsl:choose>
    <xsl:when test="some-condition">
      <xsl:apply-templates select="/" mode="option1" />
    </xsl:when>
    <xsl:otherwise test="some-condition">
      <xsl:apply-templates select="/" mode="option2" />
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

XSLT 1.0规范XSLT 2.0规范


所以我可以同时拥有起始模板和这些基于条件的匹配="/"模板,即使其中一个从另一个内部调用时,也可以从开头(根)再次迭代,即使我已经在几个级别循环下降? - Ross Cooper
或者换句话说,select =“ /”是否有助于从根节点而不是调用apply-template的当前节点进行迭代? - Ross Cooper
虽然这样做可以起作用,但更符合XSLT的方式是将模板定义为<xsl:template match="/[some-condition]">,然后再定义另一个具有不同条件的模板。当然,根据后代节点的后续处理,模式仍然可能很有用。我想到的另一个想法是,您确定不想要两个不同的XSLT程序,然后只调用您想要的那个吗? - user663031
1
@user1314871 是的,select="/" 选择根文档节点,无论当前上下文是哪个节点。 - Ian Roberts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接