XSLT分组列表



我有一个简单形式的xml文件,我想用xslt(1.0)在按类别分组的列表中显示内容,按类别字段分组的图书。对此有什么想法吗?由于

我不太熟悉xslt…关于这一点,我没有找到明确的东西,所以欢迎任何帮助

<collection>
    <book>
            <title>Sushi for dummies</title>
            <author>Judi Strada</author>
            <category>Cooking</category>
            <year>2001</year>
            <isbn>95641022</isbn>
    </book>
    <book>
            <title>Sixties Design</title>
            <author>Philippe Garner</author>
            <category>Design</category>
            <year>2007</year>
            <isbn>64781365</isbn>
    </book>
    <book>
            <title>Final Jeopardy</title>
            <author>Stephen Baker</author>
            <category>Computer Science</category>
            <year>2011</year>
            <isbn>8316363546</isbn>
    </book>
    <book>
            <title>Spoon river anthology</title>
            <author>Edgar Lee Masters</author>
            <category>Poetry</category>
            <year>1973</year>
            <isbn>21565648362</isbn>
    </book>
    <book>
            <title>The dark is rising</title>
            <author>Susan Cooper</author>
            <category>Philosophy</category>
            <year>1973</year>
            <isbn>47884564151</isbn>
    </book>
            <book>
            <title>The graphic alphabet</title>
            <author>David Pelletier</author>
            <category>Design</category>
            <year>1996</year>
            <isbn>1322456655</isbn>
    </book>
    <book>
            <title>Pattern Recognition and Machine Learning</title>
            <author>Christopher M. Bishop</author>
            <category>Computer Science</category>
            <year>2006</year>
            <isbn>45456531073</isbn>
    </book>
</collection>

尝试以下操作。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <!-- create an index of book nodes group by category -->
  <xsl:key name="bookindex" match="book" use="category"/>
  <xsl:template match="collection">
    <collections>
       <!-- select book nodes which are the first node in their relevant index -->
       <!-- this basically selects the node which has the same id as the first node
            returned from the index -->
       <xsl:apply-templates 
          select="book[generate-id() = 
                       generate-id(key('bookindex', category)[1])]"
            mode="group"/>
    </collections>
  </xsl:template>
  <!-- handle the first node as the group pivot -->
  <xsl:template match="book" mode="group">
    <group>
       <category><xsl:value-of select="category"/></category>
       <!-- select all book nodes which have the same category as myself -->
       <xsl:apply-templates select="../book[category=current()/category]"/>
    </group>
  </xsl:template>
  <!-- now handle each node in the book list -->
  <xsl:template match="book">
          <title><xsl:value-of select="title"/></title>
  </xsl:template>
</xsl:stylesheet>

这叫做"Muenchian分组":

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>
 <xsl:key name="kBooksByCat" match="book" use="category"/>
 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>
 <xsl:template match=
 "book
   [generate-id()
   =
    generate-id(key('kBooksByCat', category)[1])
   ]
 ">
  <category name="{category}">
   <xsl:copy-of select="key('kBooksByCat', category)"/>
  </category>
 </xsl:template>
</xsl:stylesheet>

当应用于提供的XML文档时:

<collection>
    <book>
        <title>Sushi for dummies</title>
        <author>Judi Strada</author>
        <category>Cooking</category>
        <year>2001</year>
        <isbn>95641022</isbn>
    </book>
    <book>
        <title>Sixties Design</title>
        <author>Philippe Garner</author>
        <category>Design</category>
        <year>2007</year>
        <isbn>64781365</isbn>
    </book>
    <book>
        <title>Final Jeopardy</title>
        <author>Stephen Baker</author>
        <category>Computer Science</category>
        <year>2011</year>
        <isbn>8316363546</isbn>
    </book>
    <book>
        <title>Spoon river anthology</title>
        <author>Edgar Lee Masters</author>
        <category>Poetry</category>
        <year>1973</year>
        <isbn>21565648362</isbn>
    </book>
    <book>
        <title>The dark is rising</title>
        <author>Susan Cooper</author>
        <category>Philosophy</category>
        <year>1973</year>
        <isbn>47884564151</isbn>
    </book>
    <book>
        <title>The graphic alphabet</title>
        <author>David Pelletier</author>
        <category>Design</category>
        <year>1996</year>
        <isbn>1322456655</isbn>
    </book>
    <book>
        <title>Pattern Recognition and Machine Learning</title>
        <author>Christopher M. Bishop</author>
        <category>Computer Science</category>
        <year>2006</year>
        <isbn>45456531073</isbn>
    </book>
</collection>

生成所需的正确分组结果:

<collection>
   <category name="Cooking">
      <book>
         <title>Sushi for dummies</title>
         <author>Judi Strada</author>
         <category>Cooking</category>
         <year>2001</year>
         <isbn>95641022</isbn>
      </book>
   </category>
   <category name="Design">
      <book>
         <title>Sixties Design</title>
         <author>Philippe Garner</author>
         <category>Design</category>
         <year>2007</year>
         <isbn>64781365</isbn>
      </book>
      <book>
         <title>The graphic alphabet</title>
         <author>David Pelletier</author>
         <category>Design</category>
         <year>1996</year>
         <isbn>1322456655</isbn>
      </book>
   </category>
   <category name="Computer Science">
      <book>
         <title>Final Jeopardy</title>
         <author>Stephen Baker</author>
         <category>Computer Science</category>
         <year>2011</year>
         <isbn>8316363546</isbn>
      </book>
      <book>
         <title>Pattern Recognition and Machine Learning</title>
         <author>Christopher M. Bishop</author>
         <category>Computer Science</category>
         <year>2006</year>
         <isbn>45456531073</isbn>
      </book>
   </category>
   <category name="Poetry">
      <book>
         <title>Spoon river anthology</title>
         <author>Edgar Lee Masters</author>
         <category>Poetry</category>
         <year>1973</year>
         <isbn>21565648362</isbn>
      </book>
   </category>
   <category name="Philosophy">
      <book>
         <title>The dark is rising</title>
         <author>Susan Cooper</author>
         <category>Philosophy</category>
         <year>1973</year>
         <isbn>47884564151</isbn>
      </book>
   </category>
   <book>
      <title>The graphic alphabet</title>
      <author>David Pelletier</author>
      <category>Design</category>
      <year>1996</year>
      <isbn>1322456655</isbn>
   </book>
   <book>
      <title>Pattern Recognition and Machine Learning</title>
      <author>Christopher M. Bishop</author>
      <category>Computer Science</category>
      <year>2006</year>
      <isbn>45456531073</isbn>
   </book>
</collection>

相关内容

  • 没有找到相关文章

最新更新