如何在xsl:apply-template中测试匹配?

时间:2011-08-22 18:09:13

标签: xslt

在我的第二个xsl:模板匹配中,如何测试匹配模式?例如,如果匹配模式是标题,我想输出不同的值?

  <xsl:template match="secondary-content">
    <div class="secondary">
      <xsl:apply-templates select="title" />
      <xsl:apply-templates select="block/content | content" />
    </div>
  </xsl:template>
  <xsl:template match="title|content|block/content">
    <xsl:copy-of select="node()" />
  </xsl:template>

3 个答案:

答案 0 :(得分:3)

好问题,+ 1。

在第二个模板中,使用此测试表达式:

test="self::title"

test="local-name() = 'title'"

例如,您可以使用

<xsl:choose>
  <xsl:when test="self::title">
    <someThing>foo</someThing>
  </xsl:when>
  <xsl:otherwise>
    <xsl:copy-of select="node()" />
  </xsl:otherwise>
</xsl:choose>

答案 1 :(得分:3)

为什么不将它分成两个单独的模板规则?当逻辑对于不同情况不同时,使用单个模板规则来处理几种情况似乎很奇怪。使用单独的规则,如果逻辑很复杂,将公共/共享逻辑分解为命名模板(或者如果您有野心,请使用xsl:next-match或xsl:apply-imports作为公共逻辑)。

答案 2 :(得分:2)

最好不要在模板主体中使用条件逻辑

因此,而不是

<xsl:template match="title|content|block/content">
  <xsl:choose>
    <!-- conditional processing here -->
  </xsl:choose>
</xsl:template>

<强>写

<xsl:template match="title">
    <!-- Some processing here -->
</xsl:template>

<xsl:template match="content|block/content">
    <!-- Some other processing here -->
</xsl:template>

顺便说一句,匹配content|block/content相当于较短的content

因此,最后一个模板可以进一步简化为

<xsl:template match="content">
    <!-- Some other processing here -->
</xsl:template>