我熟悉使用关键属性的模板,如下所示(例如关键存在foo
):
<xsl:template match="something[@foo]">
<xsl:template match="something[not(@foo)]">
但是,如果这些模板的大部分内容相同,是否有更好的方法仍然使用模板,因为社区似乎更喜欢它们?或者只是使用xsl:choose
的解决方案。显然最好不要编写必须在两个模板中维护的重复代码。
编辑: 这是我的一组特定模板:
<xsl:template match="item[not(@format)]">
<td class="{current()/../@name}_col status_all_col">
<xsl:value-of select="current()"/>
<xsl:value-of select="@units"/>
</td>
</xsl:template>
<xsl:template match="item[@format]">
<td class="{current()/../@name}_col status_all_col">
<xsl:value-of select="format-number(current(), @format)"/>
<xsl:value-of select="@units"/>
</td>
</xsl:template>
这是我目前使用的选择:
<xsl:template match="item">
<td class="{current()/../@name}_col status_all_col">
<xsl:choose>
<xsl:when test="@format">
<xsl:value-of select="format-number(current(), @format)"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="current()"/>
</xsl:otherwise>
</xsl:choose>
<xsl:value-of select="@units"/>
</td>
</xsl:template>
答案 0 :(得分:0)
在这种情况下我肯定会使用xsl:choose
。
只是为了演示如何使用模板而不重复代码:
<xsl:template match="item">
<td class="{../@name}_col status_all_col">
<xsl:apply-templates select="." mode="format"/>
<xsl:value-of select="@units"/>
</td>
</xsl:template>
<xsl:template match="item[not(@format)]" mode="format">
<xsl:value-of select="."/>
</xsl:template>
<xsl:template match="item[@format]" mode="format">
<xsl:value-of select="format-number(., @format)"/>
</xsl:template>
但我没有看到这会带来什么好处。相反,它受到GOTO syndrome的影响。
顺便说一下,这可能不是最好的例子,因为我认为提供一个空字符串作为format-number()
函数的第二个参数将导致返回的数字 as as is 。
所以你可以使用一个模板匹配所有:
<xsl:template match="item">
<td class="{../@name}_col status_all_col">
<xsl:value-of select="format-number(current(), @format)"/>
<xsl:value-of select="@units"/>
</td>
</xsl:template>