0

我正在尝试优化我的 XSLT 文件以获得更好的可读代码并避免重复。

在一部分中,我有一个必须根据条件添加到具有不同属性的 DOM(目标是 HTML)的新元素。

前任:

<xsl:choose>
    <xsl:when test="status = 0 or type = 2">
        <img id="img_{$var1}_check" height="14" width="13" src="{$var1}.png" class="{$var1}" onclick="check({$var1})" alt="{$var1}" title="{$var1}"/>
    </xsl:when>
    <xsl:when test="status = 1 or type = 24">
        <img id="img_{$var2}_check" height="14" width="13" src="{$var2}.png" class="{$var2}" onclick="check({$var2})" alt="{$var2}" title="{$var2}"/>
    </xsl:when>
    <xsl:when test="status = 2 or type = 4">
        <img id="img_{$var3}_check" height="14" width="13" src="{$var3}.png" class="{$var3}" onclick="check({$var3})" alt="{$var3}" title="{$var3}"/>
    </xsl:when>
    <xsl:when test="status = 4 or type = 22">
        <img id="img_{$var4}_check" height="14" width="13" src="{$var4}.png" class="{$var4}" onclick="check({$var4})" alt="{$var4}" title="{$var4}"/>
    </xsl:when>
</xsl:choose>

有没有办法不在img每个“何时”中写下整个元素?

问候

4

1 回答 1

0

您可以做的是将您的 xsl:choose 放入一个变量中,然后更改选择以返回 $var1、$var2、$var3 或 $var4。然后,使用这个新变量的值写出img元素

<xsl:variable name="imgvar">
    <xsl:choose>
        <xsl:when test="status = 0 or type = 2">
            <xsl:value-of select="$var1" />
        </xsl:when>
        <xsl:when test="status = 1 or type = 24">
            <xsl:value-of select="$var2" />
        </xsl:when>
        <xsl:when test="status = 2 or type = 4">
            <xsl:value-of select="$var3" />
        </xsl:when>
        <xsl:when test="status = 4 or type = 22">
            <xsl:value-of select="$var4" />
        </xsl:when>
    </xsl:choose>
</xsl:variable>
<img id="img_{$imgvar}_check" height="14" width="13" src="{$imgvar}.png" class="{$imgvar}" onclick="check({$imgvar})" alt="{$imgvar}" title="{$imgvar}"/>

我强烈怀疑这不是您想要的,因为在您的img元素的所有属性中使用相同的变量似乎不正确。

另一种方法是使用命名模板,然后从 xsl:choose 调用它

<xsl:template name="img">
    <xsl:param name="imgvar">
    <img id="img_{$imgvar}_check" height="14" width="13" src="{$imgvar}.png" class="{$imgvar}" onclick="check({$imgvar})" alt="{$imgvar}" title="{$imgvar}"/>
</xsl:template>

<xsl:variable name="imgvar">
    <xsl:choose>
        <xsl:when test="status = 0 or type = 2">
            <xsl:call-template name="img">
                <xsl:with-param name="imgvar" select="$var1" />
            </xsl:call-template>
        </xsl:when>
        <xsl:when test="status = 1 or type = 24">
            <xsl:call-template name="img">
                <xsl:with-param name="imgvar" select="$var2" />
            </xsl:call-template>
        </xsl:when>
        <xsl:when test="status = 2 or type = 4">
            <xsl:call-template name="img">
                <xsl:with-param name="imgvar" select="$var3" />
            </xsl:call-template>
        </xsl:when>
        <xsl:when test="status = 4 or type = 22">
            <xsl:call-template name="img">
                <xsl:with-param name="imgvar" select="$var4" />
            </xsl:call-template>
        </xsl:when>
    </xsl:choose>
</xsl:variable>

如果需要,这显然可以扩展为使用额外的参数。

另一种方法是将 xsl:choose 放在img元素中,并为每个选项写出不同的属性。

    <img height="14" width="13">
       <xsl:choose>
           <xsl:when test="status = 0 or type = 2">
               <xsl:attribute name="id">img_<xsl:value-of select="$var1" /></xsl:attribute>
               <xsl:attribute name="src"><xsl:value-of select="$var1" />.png</xsl:attribute>
           </xsl:when>
           <xsl:when test="status = 1 or type = 24">
               <xsl:attribute name="id">img_<xsl:value-of select="$var2" /></xsl:attribute>
               <xsl:attribute name="src"><xsl:value-of select="$var2" />.png</xsl:attribute>
           </xsl:when>
           <xsl:when test="status = 2 or type = 4">
               <xsl:attribute name="id">img_<xsl:value-of select="$var3" /></xsl:attribute>
               <xsl:attribute name="src"><xsl:value-of select="$var3" />.png</xsl:attribute>
           </xsl:when>
           <xsl:when test="status = 4 or type = 22">
               <xsl:attribute name="id">img_<xsl:value-of select="$var4" /></xsl:attribute>
               <xsl:attribute name="src"><xsl:value-of select="$var4" />.png</xsl:attribute>
           </xsl:when>
       </xsl:choose>
    </img>

我想说使用xsl:call-template是这里最好的。

于 2013-10-24T13:28:39.767 回答