<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>The very best of</TITLE>
<ARTIST>Cat Stevens</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Island</COMPANY>
<PRICE>11.90</PRICE>
<YEAR>1994</YEAR>
</CD>
<CD>
<TITLE>Hide your heart</TITLE>
<ARTIST>Bonnie Tylor</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>CBS</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1988</YEAR>
</CD>....and so on
我想在xslt中编写一个查询来打印每个国家/地区的no.of cd。这就是我如何接近它。
请帮我搞清楚。
我正在使用 XSLT 1.0
编辑:好,所以我读了关于muenchian分组并尝试了以下代码,但我仍然没有得到所需的输出。这是代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" />
<xsl:key name="country" match="//CD" use="COUNTRY" />
<xsl:template match="/">
<center>
<h2>Print the no. of records for each country.</h2>
</center>
<xsl:call-template name="query5"/>
</xsl:template>
<xsl:template name="query5">
<table align="center" border="1">
<tr>
<th>Country</th>
<th>Records</th>
</tr>
<xsl:for-each select="//CD[generate-id() = generate-id(key('country',COUNTRY)[1])]">
<xsl:sort select="COUNTRY"/>
<tr>
<td>
<xsl:value-of select="COUNTRY"/>
</td>
<td>
<xsl:for-each select="key('country', COUNTRY)">
<xsl:value-of select="count(//CD)"/>
</xsl:for-each>
</td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
但是我仍然没有得到理想的输出。请建议
答案 0 :(得分:2)
我自己不测试,这就是我要改变的地方:
<xsl:for-each select="key('country', COUNTRY)">
<xsl:value-of select="count(//CD)"/>
</xsl:for-each>
到
<xsl:value-of select="count(key('country', COUNTRY))" />
说明:
奖励:我喜欢在Jeni Tennison's example之后命名密钥,&#39; Xs-by-Y&#39;,其中X是密钥返回的东西的类型,Y是传递的值的类型到密钥(即use=
属性引用的内容)。这使我在定义密钥和使用密钥时更容易直接思考,这样我就不会对key()
函数所采用的内容和它返回的内容感到困惑。因此,在您的情况下,命名密钥'CDs-by-COUNTRY'
将使代码更具可读性并有助于防止错误。
您可以选择不同的键命名约定,但它有助于获得使键的标识与值明确相关的内容。特别是如果您不进行类型检查。