我正在使用xslt将xml文档转换为html表格,现在我要做的是更改包含最低“价格”值的单元格的背景颜色,而不对列表进行排序。
我是新手,所以我正在做的是关注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(. > ../../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>
答案 0 :(得分:3)
我想要获得的东西与此类似,但没有 按价格排序列表中的元素。
排序用于查找最小值的事实并不意味着任何元素都将被重新排序。使用<xsl:sort>
查找最小值实际上是在XSLT 1.0中执行此操作的最快方法 - 不需要任何扩展函数:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="vLowest">
<xsl:for-each select="/*/*/price">
<xsl:sort data-type="number"/>
<xsl:if test="position()=1"><xsl:value-of select="."/></xsl:if>
</xsl:for-each>
</xsl:variable>
<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:apply-templates select="cd"/>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="cd">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
<td>
<xsl:if test="price=number($vLowest)">
<xsl:attribute name="bgcolor">#ff00ff</xsl:attribute>
</xsl:if>
<xsl:value-of select="price"/>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<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>
产生了想要的正确结果:
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
<th>Price</th>
</tr>
<tr>
<td>Empire Burlesque</td>
<td>Bob Dylan</td>
<td>10.90</td>
</tr>
<tr>
<td>Black angel</td>
<td>Savage Rose</td>
<td>11.90</td>
</tr>
<tr>
<td>For the good times</td>
<td>Kenny Rogers</td>
<td bgcolor="#ff00ff">8.70</td>
</tr>
</table>
</body>
</html>
答案 1 :(得分:2)
你似乎已经回答了你的问题,但我会在这里提出其他一些事情。
(1)您可以通过向样式表或模板添加变量一次,通过<cd/>
元素重新计算每次迭代的最低价格:
<xsl:variable name="least" select="math:min(/catalog/cd/price)"/>
(2)“$ least”变量声明使用EXSLT math:min函数(命名空间为xmlns:math =“http://exslt.org/math”),这可能对您的XSLT 1.0处理器可用。如果您有2.0处理器,则可以使用内置的“min()”。
如果没有别的,min()函数对下一个人来说更具可读性。
(3)这是纯粹的风格,但你可以通过使用xsl:attribute来减少分支。
<td>
<xsl:if test="price=$lowest">
<xsl:attribute name="bgcolor">#ff00ff</xsl:attribute>
</xsl:if>
<xsl:value-of select="price"/>
</td>