在我的第二个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>
答案 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>