我首先要求显示特定的字符串记录,例如,我想首先显示所有 Rehman 记录,然后按顺序显示所有其他记录。
XML
<?xml version="1.0" encoding="UTF-8"?>
<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>Hide your heart</title>
<artist>Bonnie Tyler</artist>
<country>UK</country>
<company>CBS Records</company>
<price>9.90</price>
<year>1988</year>
</cd>
<cd>
<title>Roja</title>
<artist>Rehman</artist>
<country>USA</country>
<company>RCA</company>
<price>9.90</price>
<year>1982</year>
</cd>
<cd>
<title>Still got the blues</title>
<artist>Gary Moore</artist>
<country>UK</country>
<company>Virgin records</company>
<price>10.20</price>
<year>1990</year>
</cd>
<cd>
<title>Eros</title>
<artist>Zack</artist>
<country>EU</country>
<company>BMG</company>
<price>9.90</price>
<year>1997</year>
</cd>
<cd>
<title>Rockstar</title>
<artist>Rehman</artist>
<country>UK</country>
<company>Polydor</company>
<price>10.90</price>
<year>1998</year>
</cd>
<cd>
<title>Sylvias Mother</title>
<artist>Dr.Hook</artist>
<country>UK</country>
<company>CBS</company>
<price>8.10</price>
<year>1973</year>
</cd>
</catalog>
XSL
<?xml version="1.0" encoding="UTF-8"?>
<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>
</tr>
<xsl:for-each select="catalog/cd">
<xsl:sort select="artist" order ="descending"/>
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
结果
我的CD收藏
标题艺术家
Empire Burlesque Bob Dylan
Hide your heart Bonnie Tyler
Sylvias Mother Dr.Hook
Still got the blues Gary Moore
Roja Rehman
Rockstar Rehman
Eros Zack
答案 0 :(得分:0)
您可以使用此
<?xml version="1.0" encoding="UTF-8"?>
<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>
</tr>
<xsl:for-each select="catalog/cd[artist='Rehman']">
<xsl:sort select="artist" order ="descending"/>
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>
<xsl:for-each select="catalog/cd[artist!='Rehman']">
<!-- You can use this for sorting of rest -->
<!-- <xsl:sort select="artist" order ="descending"/> -->
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
你似乎已经拥有了你需要的大部分作品;这只是一个以有效方式组装它们的问题。特别是,您可以通过精心选择的xsl:sort
密钥来完成此操作。
您希望将带有艺术家Rehman的CD输出到所有其他CD之前,所以让我们从XPath表达式开始,该表达式在使用<cd>
元素作为当前节点进行评估时表达该条件:
artist = 'Rehman'
排序键可以是任何XPath表达式;它的值将被转换为一个字符串(之后可能会被重新解释为一个数字)。上面的表达式计算为布尔值,并在转换为将导致'true'
或'false'
的字符串时。由于'true'
在'false'
之后按字典顺序排列,并且您希望首先输出表达式为true的CD,因此您需要为该键指定降序:
<xsl:for-each select="catalog/cd">
<xsl:sort select="artist = 'Rehman'" order="descending"/>
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>
如果您想进一步细化订单,例如要按艺术家的字母顺序显示剩余的记录,然后您可以添加任意数量的其他排序键;应用于相同范围的多个键根据它们出现的顺序从最大到最小归属。