如何在XSLT中选择具有最大价值的元素?

时间:2015-09-30 13:37:26

标签: xml xslt

我通过XSLT样式表形成HTML文档。该文件中的表格包含一些降雨数据,最低温度和最高温度以及每天的太阳辐射。

我遇到的问题是,当我尝试检索最高温度并突出显示其单元格时,每次加载文件时都会崩溃浏览器。这是我到目前为止: weather.xsl

    <?xml version="1.0" encoding="UTF-8"?>
    <!--
    Document   : weather.xsl
    Created on : September 30, 2015, 5:37 PM
    Author     : rory
    Description:
        Purpose of transformation follows.
    -->

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="html"/>

    <xsl:variable name="year" select="2015"/>
    <xsl:variable name="x" select="//measurement[@year=$year]"/>
    <xsl:variable name="monthsOfYear" select="$x[@day=1]/month"/>
    <xsl:variable name="daysOfMonth" select="$x[@month=1]/day"/>
    <xsl:variable name="highestRainfall" select="$x/rainfall[.!=''][not( . &lt; $x/rainfall)]"/>
    <xsl:variable name="highestMinTemp" select="//temperature[@type='minimum' and .!=''][not( . &lt; //temperature[@type='minimum'])]" />

    <!-- TODO customize transformation rules 
         syntax recommendation http://www.w3.org/TR/xslt 
    -->
    <xsl:template match="weather">
        <html>
            <head>
                <title>Formatted Weather Outputs (Question 6)</title>

                <style>
                    .odd{
                        background: lightgreen;
                    }
                    .even{
                        background: violet;
                    }
                    .negative{
                        color: red;
                    }
                    .highest{
                        background: gold;
                    }
                </style>
            </head>
            <body>
                <table border="1" style="text-align:center;border-collapse:collapse;">
                    <tr>
                        <th>Date (DD/MM/YYYY)</th>
                        <th>Min Temp (<sup>o</sup>C)</th>
                        <th>Max Temp (<sup>o</sup>C)</th>
                        <th>Solar Radiation (kwh)</th>
                        <th>Rainfall (mm)</th>
                    </tr>

                    <!-- Only display dates for 2015 -->
                        <xsl:for-each select="measurement[@year='2015']">
                            <tr>
                                <xsl:attribute name="class">
                                    <xsl:choose>
                                        <xsl:when test="(@month mod 2 != 0)">odd</xsl:when>
                                        <xsl:otherwise>even</xsl:otherwise>
                                    </xsl:choose>
                                </xsl:attribute>

                                <td>
                                    <xsl:value-of select="concat(@day, '/', @month, '/', @year)" />
                                </td>
                                <td>
                                    <xsl:attribute name="class">
                                        <xsl:choose>
                                            <xsl:when test="temperature[@type='minimum'] &lt; 0">negative</xsl:when>
                                        </xsl:choose>
                                    </xsl:attribute>
                                    <xsl:variable name="miniTemp" select="temperature[@type='minimum']" />
                                    <xsl:if test=" $miniTemp = $highestMinTemp">
                                        <xsl:attribute name="style">background-color:gold</xsl:attribute>
                                    </xsl:if>
                                    <xsl:value-of select="temperature[@type='minimum']" />
                                </td>
                                <td>
                                        <xsl:value-of select="temperature[@type='maximum']" />                                   
                                </td>
                                <td>
                                    <xsl:value-of select="solar"/>
                                </td>
                                <td>
                                    <xsl:if test=" rainfall = $highestRainfall">
                                        <xsl:attribute name="style">background-color:gold</xsl:attribute>
                                    </xsl:if>
                                    <xsl:value-of select="rainfall" />
                                </td>
                            </tr>
                        </xsl:for-each>
                </table>
            </body>
        </html>
    </xsl:template>

</xsl:stylesheet>

它特别崩溃在看起来如下的部分:

<xsl:variable name="miniTemp" select="temperature[@type='minimum']" />
    <xsl:if test=" $miniTemp = $highestMinTemp">
       <xsl:attribute name="style">background-color:gold</xsl:attribute>
    </xsl:if>

如果有人能提供一些帮助或建议,我非常感激。

1 个答案:

答案 0 :(得分:0)

在我自己的白痴中使用提供给我的代码,我没有调整我的变量$ x。更改以下行:

<xsl:variable name="highestMinTemp" select="//temperature[@type='minimum' and .!=''][not( . &lt; //temperature[@type='minimum'])]" />

如此修改它:

<xsl:variable name="highestMinTemp" select="$x/temperature[@type='minimum' and .!=''][not( . &lt; $x/temperature[@type='minimum'])]" />