当前位置 : 主页 > 网页制作 > xml >

从而选择xml中的最低值而不进行排序

来源:互联网 收集:自由互联 发布时间:2021-06-13
我正在使用xslt将xml文档转换为html表,现在我想要做的是更改包含最低“price”值的单元格的背景颜色,而不对列表进行排序. 我是新手,所以我正在做的是遵循W3C学校的例子. xml文件如下所
我正在使用xslt将xml文档转换为html表,现在我想要做的是更改包含最低“price”值的单元格的背景颜色,而不对列表进行排序.

我是新手,所以我正在做的是遵循W3C学校的例子. xml文件如下所示:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy® -->
<catalog>
<cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
</cd>
<cd>
    <title>Black angel</title>
    <artist>Savage Rose</artist>
    <country>EU</country>
    <company>Mega</company>
    <price>11.90</price>
    <year>1995</year>
</cd>
<cd>
    <title>For the good times</title>
    <artist>Kenny Rogers</artist>
    <country>UK</country>
    <company>Mucik Master</company>
    <price>8.70</price>
    <year>1995</year>
</cd>
</catalog>

我想要获得的是类似于此但没有按价格排序列表中的元素.所以我想在XML文档中维护原始顺序.

<?xml version="1.0" encoding="ISO-8859-1"?>
    <!-- Edited by XMLSpy® -->
    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
     <html>
      <body>
        <h2>My CD Collection</h2>
        <table border="1">
          <tr bgcolor="#9acd32">
          <th>Title</th>
          <th>Artist</th>
          <th>Price</th>
        </tr>
        <xsl:for-each select="catalog/cd">
        <xsl:sort select="price" order="ascending" data-type="number"/>
          <tr>
            <td><xsl:value-of select="title"/></td>
            <td><xsl:value-of select="artist"/></td>
            <xsl:choose>
              <xsl:when test="(position() = 1)">
                <td bgcolor="#ff00ff">
                <xsl:value-of select="price"/></td>
              </xsl:when>
            <xsl:otherwise>
                <td><xsl:value-of select="price"/></td>
            </xsl:otherwise>
            </xsl:choose>
          </tr>
        </xsl:for-each>
        </table>
      </body>
      </html>
    </xsl:template>
    </xsl:stylesheet>

在此先感谢您的帮助.

编辑:我想我找到了一个问题的解决方案:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy® -->
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
  <html>
  <body>
    <h2>My CD Collection</h2>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th>Title</th>
        <th>Artist</th>
        <th>Price</th>
      </tr>
      <xsl:for-each select="catalog/cd">
       <tr>
        <td><xsl:value-of select="title"/></td>
        <td><xsl:value-of select="artist"/></td>
        <xsl:choose>
          <xsl:when test="price=/catalog/cd/price[not(. &gt; ../../cd/price)][1]">
            <td bgcolor="#ff00ff">
            <xsl:value-of select="price"/></td>
          </xsl:when>
        <xsl:otherwise>
            <td><xsl:value-of select="price"/></td>
        </xsl:otherwise>
        </xsl:choose>
      </tr>

      </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>
你似乎已经回答了你的问题,但我会在这里提出其他一些事情.

(1)您可以避免通过< cd />重新计算每次迭代的最低价格.通过向样式表或模板添加变量来执行计算一次:

<xsl:variable name="least" select="math:min(/catalog/cd/price)"/>

(2)“$least”变量声明使用EXSLT数学:min函数(命名空间为xmlns:math =“http://exslt.org/math”),它可供您的XSLT 1.0处理器使用.如果您有2.0处理器,则可以使用内置的“min()”.

如果没有别的,min()函数对下一个人来说更具可读性.

(3)这是纯粹的风格,但你可以通过使用xsl:属性来减少分支.

<td>
    <xsl:if test="price=$lowest">
        <xsl:attribute name="bgcolor">#ff00ff</xsl:attribute>
    </xsl:if>
    <xsl:value-of select="price"/>
</td>
网友评论