XSLT 对独特项目进行排序

问题描述 投票:0回答:1
sorting xslt
1个回答
0
投票

以下是 XSLT 2 或更高版本中的嵌套分组如何使这变得简单:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="3.0"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="#all">
  
  <xsl:output method="html" indent="yes" version="5.0"/>

  <xsl:template match="global">
    <html>
      <head>
        <title>nested grouping example</title>
      </head>
      <body>
        <ul>
          <xsl:for-each-group select="item" group-by="@university">
            <li><h3><xsl:value-of select="@university"/></h3></li>
            <p>Count: <xsl:value-of select="count(current-group())"/></p>
            <ul>
              <xsl:for-each-group select="current-group()" group-by="@staff">
                <li><h4><xsl:value-of select="@staff"/></h4></li>
                <p>Count: <xsl:value-of select="count(current-group())"/></p>
                <ul>
                   <xsl:for-each select="current-group()">
                     <li><xsl:value-of select="@course"/></li>
                   </xsl:for-each>
                </ul>
              </xsl:for-each-group>
            </ul>            
          </xsl:for-each-group>          
        </ul>
      </body>
    </html>
  </xsl:template>
  
</xsl:stylesheet>

通过 XSLT 1 中的两个级别键和 Muenchian 分组,您可以做到

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" indent="yes"/>
    <xsl:key name="key_univ" match="/global/item" use="@university"/> 
    <xsl:key name="key_staff" match="/global/item" use="concat(@university, '|', @staff)"/>
    <xsl:template match="global">
          <html>               
            <body>
                <ul>
                  <xsl:apply-templates select="item[generate-id() = generate-id(key('key_univ', @university)[1])]"/>
                </ul>
            </body>
        </html>
</xsl:template>

<xsl:template match="item">
  <li><h3><xsl:value-of select="@university"/></h3></li>
  <p>Count: <xsl:value-of select="count(key('key_univ', @university))"/></p>
  <ul>
    <xsl:for-each select="key('key_univ', @university)[generate-id() = generate-id(key('key_staff', concat(@university, '|', @staff))[1])]">
      <li><h4><xsl:value-of select="@staff"/></h4></li>
      <p>Count: <xsl:value-of select="count(key('key_staff', concat(@university, '|', @staff)))"/></p>
      <ul>
         <xsl:for-each select="key('key_staff', concat(@university, '|', @staff))">
           <li><xsl:value-of select="@course"/></li>
         </xsl:for-each>
      </ul>
    </xsl:for-each>
  </ul>
</xsl:template>

</xsl:stylesheet>
© www.soinside.com 2019 - 2024. All rights reserved.