我有那些不以任何特定的排序順序條目的CD列表:獲取上一個元素在XSLT 1.0排序順序,而不是DOM爲了
<?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>Greatest Hits</title>
<artist>Dolly Parton</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>
</catalog>
我想輸出HTML中的列表中,由分組標題的第一個字母。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="catalog">
<catalog>
<xsl:apply-templates select="cd"><xsl:sort select="title"/></xsl:apply-templates>
</catalog>
</xsl:template>
<xsl:template match="cd"><xsl:copy-of select="."/></xsl:template>
</xsl:stylesheet>
,然後讓我用preceding-sibling
檢查標題字母的變化:由於躲避我怎麼了,我先通過一個簡單的排序跑了XML。所得片材是這樣的:
<?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>
<head>
<title> Booklist with books <xsl:value-of select="count(/catalog/cd)"/>
</title>
<style type="text/css">
table.main {width : 100%}
table.main td {padding : 2px; border-bottom : 1px solid gray}
th {text-align : left}
tr.header {background-color : #9acd32}
table.bar {border: 1px solid gray; background-color #CACACA}
table.bar td {border-left : 1px solid gray; padding : 4px; margin : 2px; font-size : x-large}
tr.firstbook {background-color : #CACACA}
td.firstbook {font-size : xx-large}
td.firstbook a.up {text-decoration: none; font-size : normal}
</style>
</head>
<body>
<xsl:apply-templates mode="header"/>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="catalog">
<table class="main">
<tr class="header">
<th> Title </th>
<th> Artist </th>
<th> Country </th>
<th> Company </th>
<th> Price </th>
<th> Year </th>
</tr>
<xsl:apply-templates select="cd">
<xsl:sort select="title"/>
</xsl:apply-templates>
</table>
</xsl:template>
<xsl:template match="cd">
<xsl:variable name="firstLetter" select="substring(title,1,1)"/>
<xsl:variable name="oldLetter" select="substring(preceding-sibling::*[1]/title,1,1)"/>
<xsl:if test="not($firstLetter=$oldLetter)">
<tr class="firstbook">
<td class="firstbook" colspan="5">
<a name="{$firstLetter}">
<xsl:value-of select="$firstLetter"/>
</a>
</td>
<td class="firstbook">
<a class="up" href="#">⬆</a>
</td>
</tr>
</xsl:if>
<tr>
<td>
<xsl:value-of select="title"/>
</td>
<td>
<xsl:value-of select="artist"/>
</td>
<td>
<xsl:value-of select="country"/>
</td>
<td>
<xsl:value-of select="company"/>
</td>
<td>
<xsl:value-of select="price"/>
</td>
<td>
<xsl:value-of select="year"/>
</td>
</tr>
</xsl:template>
<!-- Header link handling -->
<xsl:template match="catalog" mode="header">
<table class="bar">
<tr>
<xsl:apply-templates mode="header"
select="cd[not(substring(title,1,1)=substring(preceding-sibling::*[1]/title,1,1))]">
<xsl:sort select="title"/>
</xsl:apply-templates>
</tr>
</table>
</xsl:template>
<xsl:template mode="header" match="cd">
<xsl:variable name="firstLetter" select="substring(title,1,1)"/>
<td>
<a href="#{$firstLetter}">
<xsl:value-of select="$firstLetter"/>
</a>
</td>
</xsl:template>
</xsl:stylesheet>
的關鍵部分是該比較:not(substring(title,1,1)=substring(preceding-sibling::*[1]/title,1,1))
看起來在DOM和不排序操作的結果。
我正在尋找的是在XSLT-1.0的方式來結合兩個轉變的效果,所以我有一個樣式,一個未排序的輸入列表,並且看起來像兩個樣式目前生產的結果:
我該怎麼辦呢?
對於XSLT 1.0中的*分組*,請參閱http://www.jenitennison.com/xslt/grouping/muenchian.html以及SO上的許多許多示例。 –