【问题标题】:How to compare XML element with XSL variable如何比较 XML 元素与 XSL 变量
【发布时间】:2010-09-28 20:55:35
【问题描述】:

我正在使用 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 将项目值与“比较器”节点值进行比较,如果它们相等,则将表格中的单元格加粗,否则将单元格值加粗。我需要在不使用 javascript 的情况下完成此操作,因此必须在 xsl 中完成。现在,我正在考虑使用 xsl:variable 然后尝试使用 xsl:when 进行比较。不幸的是,我运气不佳。这是我刚刚开始对表格中的每一行进行处理的内容:

<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。我只是想专注于我的问题。

【问题讨论】:

    标签: html xml xslt


    【解决方案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>
    

    【讨论】:

    • expireDate 是什么意思?你的意思是 $compare 吗?我正在努力实现同样的目标,但它对我不起作用。
    【解决方案2】:

    这个样式表:

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

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

    【讨论】:

    • 有没有一种方法可以让我不必重新构建文档以使用模板?类似于:
    • @gun_shy:模式匹配 XSLT 的意义所在。对于测试,使用节点集比较:. = /main/comparer,就像我在模式的谓词中所做的那样。
    • 您的相等条件基于节点的文本。知道如何同时考虑节点的属性(我知道这个例子没有)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    相关资源
    最近更新 更多