如何实现没有冗余的属性特定模板

时间:2016-08-30 16:42:25

标签: xslt xslt-1.0

我熟悉使用关键属性的模板,如下所示(例如关键存在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>

1 个答案:

答案 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>