用于XML到HTML转换的XSL:根据正面或负面对xml数据值进行着色

时间:2016-05-26 05:46:11

标签: html xml xslt

用于XML到HTML转换的XSL:根据xml数据值是正数还是负数

对颜色进行着色

我的XML文件。

<roots>
    <root>
    <text1>increased by</text1>
    <value1>10</value1>
    <text2>decreased by<text2>
    <value2>-7</value2>
    </root>
</roots>

预期的HTML输出:

increased by 10 --(value 10 in green color)
decreased by -7 -- (value -7 in red color)

我尝试以下方式实现XSLT ......

<xsl:template match="value1">
<xsl:if test="value1 >= 0">
     <font color="green"><xsl:apply-templates/>/></font>
</xsl:if>
</xsl:template>

<xsl:template match="value1">
<xsl:if test="value1 < 0">
     <font color="red"><xsl:apply-templates/>/></font>
</xsl:if>
</xsl:template>

1 个答案:

答案 0 :(得分:1)

你有两个模板具有完全相同的匹配模式 - 这不会起作用。为每个模板使用不同的匹配模式,例如:

<xsl:template match="value1[. >= 0]">

<xsl:template match="value1[. &lt; 0]">

或使用xsl:choose的单个模板选择颜色。

另请注意,您有几个语法错误,例如<xsl:apply-templates/>/>(标记的双重关闭)或尝试使用未转义的<字符作为比较运算符。

加了:

如果正如您所说,您的XML确实包含编号节点(text1,text2,value1,value2等),那么您必须更改匹配模式以解决该问题。否则,您需要与输入中的值一样多的模板(如果您需要单独的模板用于正值和负值,则需要两倍)。

例如,对两种情况使用单个模板,使用xsl:choose选择颜色:

<xsl:template match="*[starts-with(name(), 'value')]">
    <xsl:variable name="color">
        <xsl:choose>
            <xsl:when test=". >= 0">green</xsl:when>
            <xsl:otherwise>red</xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
    <font color="{$color}">
        <xsl:value-of select="." />
    </font>     
    <br/>
</xsl:template>