xslt中的分组依据

时间:2014-04-17 13:41:06

标签: xml xslt-1.0

<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。这就是我如何接近它。

  • 我按照国家/地区的升序对CD进行了排序。
  • 然后在for-each循环中为每个国家我尝试计算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>

但是我仍然没有得到理想的输出。请建议

1 个答案:

答案 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))" />

说明:

  • 你有一个外环做一个适当的Muenchian分组&#34;为每个国家&#34 ;;或更确切地说,对于每张CD而言,它是各自国家的第一张CD&#34;。 (很好地应用了Muenchian技术BTW,如果这是你的第一次。)
  • 在该循环中,您要求XPath计算当前CD的COUNTRY键返回的集合中的节点数。

奖励:我喜欢在Jeni Tennison's example之后命名密钥,&#39; Xs-by-Y&#39;,其中X是密钥返回的东西的类型,Y是传递的值的类型到密钥(即use=属性引用的内容)。这使我在定义密钥和使用密钥时更容易直接思考,这样我就不会对key()函数所采用的内容和它返回的内容感到困惑。因此,在您的情况下,命名密钥'CDs-by-COUNTRY'将使代码更具可读性并有助于防止错误。

您可以选择不同的键命名约定,但它有助于获得使键的标识与值明确相关的内容。特别是如果您不进行类型检查。