如何比较XML元素和XSL变量

时间:2010-09-28 20:55:36

标签: html xml xslt

我正在使用xslt将xml文档转换为html,以便在电子邮件中使用。我需要将xml元素与另一个xml元素值进行比较,以便我知道给出该值的格式。基本上我有一个xml结构:

<main>
    <comparer>1</comparer>
    <items>
        <item>
            <name>blarg</name>
            <values>
                <value>1</value>
                <value>2</value>
            </values>
    </items>
</main>

项目信息用于构建表格:

<table>
    <tr>
        <td>blarg</td>
        <td>1</td>
        <td>2</td>
    </tr>
</table>

我需要做的是使用xsl将项值与'comparer'节点值进行比较,如果它们相等则加粗表格中的单元格,否则单元格值我用鼻子加粗。我需要在不使用javascript的情况下完成此操作,因此必须在xsl中完成。现在,我正在考虑使用xsl:variable然后尝试使用xsl:何时进行比较。不幸的是,我运气不好。这就是我刚刚开始为表中的每一行使用的内容:

<xsl:variable name="compare" select="//main/comparer" />

...    

<xsl:for-each select="value">
    <td>
        <xsl:choose>
            <xsl:when test=". = $compare">
                <b>
                    <xsl:value-of select="."/>
                </b>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="."/>.
            </xsl:otherwise>
        </xsl:choose>
    </td>
</xsl:for-each>

* 注意:为简洁起见,我遗漏了大部分xsl。我只是想集中讨论我的问题。

2 个答案:

答案 0 :(得分:1)

我经过一些试验和错误后想出来了。亚历杭德罗的回答似乎是可行的,但我没有重组xsl以利用模板的奢侈。以下是我用来解决问题的方法:

<xsl:variable name="compare" select="//main/comparer" />

...    

<xsl:for-each select="value">
    <td>
        <xsl:choose>
            <xsl:when test="contains(., $expireDate)">
                <b>
                    <xsl:value-of select="."/>
                </b>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="."/>.
            </xsl:otherwise>
        </xsl:choose>
    </td>
</xsl:for-each>

答案 1 :(得分:0)

此样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="main">
        <table>
            <xsl:apply-templates select="items"/>
        </table>
    </xsl:template>
    <xsl:template match="item">
        <tr>
            <xsl:apply-templates/>
        </tr>
    </xsl:template>
    <xsl:template match="name|value">
        <td>
            <xsl:apply-templates/>
        </td>
    </xsl:template>
    <xsl:template match="value/text()[.=/main/comparer]">
        <b>
            <xsl:value-of select="."/>
        </b>
    </xsl:template>
</xsl:stylesheet>

输出:

<table>
    <tr>
        <td>blarg</td>
        <td>
            <b>1</b>
        </td>
        <td>2</td>
    </tr>
</table>

注意:模式匹配和节点集比较。