使用XSLT对XML进行排序?

时间:2017-09-05 20:04:17

标签: xml xslt

我正在使用XSLT显示我的XML

我的XML看起来像这样

    <main>
  <DATA_RECORD>
    <DESCRIPTION></DESCRIPTION>
    <TITLE>Financial Accounting</TITLE>
    <COURSE_NUM>1010</COURSE_NUM>
    <MIN_CREDITS>4</MIN_CREDITS>
    <MAX_CREDITS></MAX_CREDITS>
    <SUBJ>ACCT</SUBJ>
    <DEPT_ID>BUSN</DEPT_ID>
    <DEPT>Business</DEPT>
  </DATA_RECORD>
  <DATA_RECORD>
    <DESCRIPTION></DESCRIPTION>
    <TITLE>Managerial Accounting</TITLE>
    <COURSE_NUM>1020</COURSE_NUM>
    <MIN_CREDITS>4</MIN_CREDITS>
    <MAX_CREDITS></MAX_CREDITS>
    <SUBJ>ACCT</SUBJ>
    <DEPT_ID>BUSN</DEPT_ID>
    <DEPT>Business</DEPT>
  </DATA_RECORD>
  <DATA_RECORD>
    <DESCRIPTION></DESCRIPTION>
    <TITLE>Computerized Accounting</TITLE>
    <COURSE_NUM>1030</COURSE_NUM>
    <MIN_CREDITS>3</MIN_CREDITS>
    <MAX_CREDITS></MAX_CREDITS>
    <SUBJ>ACCT</SUBJ>
    <DEPT_ID>BUSN</DEPT_ID>
    <DEPT>Business</DEPT>
  </DATA_RECORD>
  <DATA_RECORD>
    <DESCRIPTION></DESCRIPTION>
    <TITLE>ELEM ACCT I ADV PLACE</TITLE>
    <COURSE_NUM>1110</COURSE_NUM>
    <MIN_CREDITS>4</MIN_CREDITS>
    <MAX_CREDITS></MAX_CREDITS>
    <SUBJ>ACCT</SUBJ>
    <DEPT_ID>BUSN</DEPT_ID>
    <DEPT>Business</DEPT>
  </DATA_RECORD>
  <DATA_RECORD>
    <DESCRIPTION></DESCRIPTION>
    <TITLE>ELEM ACCT II ADV PLACE</TITLE>
    <COURSE_NUM>1120</COURSE_NUM>
    <MIN_CREDITS>4</MIN_CREDITS>
    <MAX_CREDITS></MAX_CREDITS>
    <SUBJ>ACCT</SUBJ>
    <DEPT_ID>BUSN</DEPT_ID>
    <DEPT>Business</DEPT>
  </DATA_RECORD>
  <DATA_RECORD>
    <DESCRIPTION></DESCRIPTION>
    <TITLE>Personal Income Taxes</TITLE>
    <COURSE_NUM>1500</COURSE_NUM>
    <MIN_CREDITS>3</MIN_CREDITS>
    <MAX_CREDITS></MAX_CREDITS>
    <SUBJ>ACCT</SUBJ>
    <DEPT_ID>BUSN</DEPT_ID>
    <DEPT>Business</DEPT>
  </DATA_RECORD>
  <DATA_RECORD>
    <DESCRIPTION></DESCRIPTION>
    <TITLE>Business Income Taxes</TITLE>
    <COURSE_NUM>1510</COURSE_NUM>
    <MIN_CREDITS>3</MIN_CREDITS>
    <MAX_CREDITS></MAX_CREDITS>
    <SUBJ>ACCT</SUBJ>
    <DEPT_ID>BUSN</DEPT_ID>
    <DEPT>Business</DEPT>
  </DATA_RECORD>
  <DATA_RECORD>
    <DESCRIPTION></DESCRIPTION>
    <TITLE>PAYROLL</TITLE>
    <COURSE_NUM>1600</COURSE_NUM>
    <MIN_CREDITS>2</MIN_CREDITS>
    <MAX_CREDITS></MAX_CREDITS>
    <SUBJ>ACCT</SUBJ>
    <DEPT_ID>BUSN</DEPT_ID>
    <DEPT>Business</DEPT>
  </DATA_RECORD>
  <DATA_RECORD>
    <DESCRIPTION></DESCRIPTION>
    <TITLE>Intermediate Accounting I</TITLE>
    <COURSE_NUM>2010</COURSE_NUM>
    <MIN_CREDITS>4</MIN_CREDITS>
    <MAX_CREDITS></MAX_CREDITS>
    <SUBJ>ACCT</SUBJ>
    <DEPT_ID>BUSN</DEPT_ID>
    <DEPT>Business</DEPT>
  </DATA_RECORD>
  <DATA_RECORD>
    <DESCRIPTION></DESCRIPTION>
    <TITLE>Intermediate Accounting II</TITLE>
    <COURSE_NUM>2020</COURSE_NUM>
    <MIN_CREDITS>4</MIN_CREDITS>
    <MAX_CREDITS></MAX_CREDITS>
    <SUBJ>ACCT</SUBJ>
    <DEPT_ID>BUSN</DEPT_ID>
    <DEPT>Business</DEPT>
  </DATA_RECORD>
  <DATA_RECORD>
    <DESCRIPTION></DESCRIPTION>
    <TITLE>MANAGERIAL ACCOUNTING</TITLE>
    <COURSE_NUM>2030</COURSE_NUM>
    <MIN_CREDITS>4</MIN_CREDITS>
    <MAX_CREDITS></MAX_CREDITS>
    <SUBJ>ACCT</SUBJ>
    <DEPT_ID>BUSN</DEPT_ID>
    <DEPT>Business</DEPT>
  </DATA_RECORD>
  <DATA_RECORD>
    <DESCRIPTION></DESCRIPTION>
    <TITLE>ADMIN DCTN &#38; TRANSC</TITLE>
    <COURSE_NUM>2540</COURSE_NUM>
    <MIN_CREDITS>5</MIN_CREDITS>
    <MAX_CREDITS></MAX_CREDITS>
    <SUBJ>ADAS</SUBJ>
    <DEPT_ID>OFAD</DEPT_ID>
    <DEPT>Office Administration</DEPT>
  </DATA_RECORD>
  <DATA_RECORD>
    <DESCRIPTION></DESCRIPTION>
    <TITLE>MS Office Applications II</TITLE>
    <COURSE_NUM>2510</COURSE_NUM>
    <MIN_CREDITS>3</MIN_CREDITS>
    <MAX_CREDITS></MAX_CREDITS>
    <SUBJ>ADAS</SUBJ>
    <DEPT_ID>OFTD</DEPT_ID>
    <DEPT>Admsntrtv Office Technology</DEPT>
  </DATA_RECORD>
  <DATA_RECORD>
    <DESCRIPTION>This is an introductory course for beginners emphasizing correct pronunciation and basic vocabulary for practical use in everyday conversational situations and travel dialogues. Students with no previous study of the language are prepared to use and understand it within a limited context and basic structure.  Lecture: 3 hours</DESCRIPTION>
    <TITLE>Office Transcription II</TITLE>
    <COURSE_NUM>2520</COURSE_NUM>
    <MIN_CREDITS>2</MIN_CREDITS>
    <MAX_CREDITS></MAX_CREDITS>
    <SUBJ>ADAS</SUBJ>
    <DEPT_ID>OFTD</DEPT_ID>
    <DEPT>Admsntrtv Office Technology</DEPT>
  </DATA_RECORD>
  <DATA_RECORD>
    <DESCRIPTION></DESCRIPTION>
    <TITLE>Office Tech &#38; Procedures II</TITLE>
    <COURSE_NUM>2530</COURSE_NUM>
    <MIN_CREDITS>3</MIN_CREDITS>
    <MAX_CREDITS></MAX_CREDITS>
    <SUBJ>ADAS</SUBJ>
    <DEPT_ID>OFTD</DEPT_ID>
    <DEPT>Admsntrtv Office Technology</DEPT>
  </DATA_RECORD>
  <DATA_RECORD>
    <DESCRIPTION></DESCRIPTION>
    <TITLE>Administrative Office Mgt</TITLE>
    <COURSE_NUM>2570</COURSE_NUM>
    <MIN_CREDITS>3</MIN_CREDITS>
    <MAX_CREDITS></MAX_CREDITS>
    <SUBJ>ADAS</SUBJ>
    <DEPT_ID>OFTD</DEPT_ID>
    <DEPT>Admsntrtv Office Technology</DEPT>
  </DATA_RECORD>
  <DATA_RECORD>
    <DESCRIPTION></DESCRIPTION>
    <TITLE>Office Admin Coop Ed I</TITLE>
    <COURSE_NUM>2580</COURSE_NUM>
    <MIN_CREDITS>3</MIN_CREDITS>
    <MAX_CREDITS></MAX_CREDITS>
    <SUBJ>ADAS</SUBJ>
    <DEPT_ID>OFTD</DEPT_ID>
    <DEPT>Admsntrtv Office Technology</DEPT>
  </DATA_RECORD>
  <DATA_RECORD>
    <DESCRIPTION></DESCRIPTION>
    <TITLE>Office Admin Coop Ed II</TITLE>
    <COURSE_NUM>2590</COURSE_NUM>
    <MIN_CREDITS>4</MIN_CREDITS>
    <MAX_CREDITS></MAX_CREDITS>
    <SUBJ>ADAS</SUBJ>
    <DEPT_ID>OFTD</DEPT_ID>
    <DEPT>Admsntrtv Office Technology</DEPT>
  </DATA_RECORD>
  <DATA_RECORD>
    <DESCRIPTION></DESCRIPTION>
    <TITLE>MS Office Applications III</TITLE>
    <COURSE_NUM>2610</COURSE_NUM>
    <MIN_CREDITS>3</MIN_CREDITS>
    <MAX_CREDITS></MAX_CREDITS>
    <SUBJ>ADAS</SUBJ>
    <DEPT_ID>OFTD</DEPT_ID>
    <DEPT>Admsntrtv Office Technology</DEPT>
  </DATA_RECORD>
  <DATA_RECORD>
    <DESCRIPTION></DESCRIPTION>
    <TITLE>Office Admin Career Dev</TITLE>
    <COURSE_NUM>2620</COURSE_NUM>
    <MIN_CREDITS>3</MIN_CREDITS>
    <MAX_CREDITS></MAX_CREDITS>
    <SUBJ>ADAS</SUBJ>
    <DEPT_ID>OFTD</DEPT_ID>
    <DEPT>Admsntrtv Office Technology</DEPT>
  </DATA_RECORD>
  <DATA_RECORD>
    <DESCRIPTION></DESCRIPTION>
    <TITLE>NURSING I</TITLE>
    <COURSE_NUM>1010</COURSE_NUM>
    <MIN_CREDITS>7</MIN_CREDITS>
    <MAX_CREDITS></MAX_CREDITS>
    <SUBJ>ADNU</SUBJ>
    <DEPT_ID>ADN</DEPT_ID>
    <DEPT>AD Nursing</DEPT>
  </DATA_RECORD>
  <DATA_RECORD>
    <DESCRIPTION></DESCRIPTION>
    <TITLE>NURSING II</TITLE>
    <COURSE_NUM>1020</COURSE_NUM>
    <MIN_CREDITS>7</MIN_CREDITS>
    <MAX_CREDITS></MAX_CREDITS>
    <SUBJ>ADNU</SUBJ>
    <DEPT_ID>ADN</DEPT_ID>
    <DEPT>AD Nursing</DEPT>
  </DATA_RECORD>
</main>

我的XSLT看起来像这样

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
    <?xml-stylesheet href="/_resources-2016/xsl/catalog.xsl" type="text/xsl"?>
    <xsl:output method="html"/>

    <xsl:template match ="/">
        <html>
            <head> 
                <script language="javascript" type="text/javascript"></script>          
            </head>
            <body>
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12">
                            <xsl:for-each select="main/DATA_RECORD">
                                <!--<h2><xsl:value-of select="SUBJ" /> (<xsl:value-of select="DEPT" />)</h2> -->    
                                <ul class="verysimplelist">        
                                    <li style="font-size:150%; font-weight:400">
                                        <xsl:value-of select="SUBJ" />
                                    </li>

                                    <li style="font-size:150%; font-weight:400">
                                        <xsl:value-of select="COURSE_NUM"/>
                                    - </li>

                                    <li style="font-size:140%; font-weight:400; font-style:italic">
                                        <xsl:value-of select="TITLE"/>
                                    </li>

                                    <li style="font-size:150%; font-weight:400">
                                        (<xsl:value-of select="MIN_CREDITS"/>
                                    Credits)</li>
                                </ul>
                                <p>              
                                    <xsl:value-of select="DESCRIPTION" />
                                </p>
                            </xsl:for-each>               
                        </div>
                    </div>
                </div>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

所以使用for-each对我来说很有效,而且我得到了所需的输出,但是我想要一些额外的功能。

我希望它们按字母顺序分组,但由<DEPT>按h2标记中每个组顶部的dept名称或类似名称进行分组。我似乎无法让这个工作。有任何想法吗?谢谢!

1 个答案:

答案 0 :(得分:1)

如上所述,在XSLT 1.0中,考虑Muenchian Grouping,您可以通过某个键<xsl:key>为文档编制索引,然后生成分组并映射相同组下的相应节点。

下面为每个 Dept 添加<h2>标记,作为其他<DATA_RECORD>节点输出上方的标题。

<?xml version="1.0" encoding="utf-8"?>
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
     <?xml-stylesheet href="/_resources-2016/xsl/catalog.xsl" type="text/xsl"?>
     <xsl:output method="html"/>

   <xsl:key name="deptid" match="DATA_RECORD" use="DEPT"/>

   <xsl:template match ="/main">
        <xsl:apply-templates select="DATA_RECORD"/>
   </xsl:template>

   <xsl:template match ="DATA_RECORD">
     <html>
       <head> 
         <script language="javascript" type="text/javascript"></script>

       </head>
       <body>
           <div class="container">
           <div class="row">
           <div class="col-xs-12">
            <xsl:for-each select="self::node()[generate-id() = 
                                  generate-id(key('deptid', DEPT)[1])]">
                <h2><xsl:value-of select="DEPT"/></h2>

                <xsl:for-each select="key('deptid', DEPT)">                 
                    <!--<h2><xsl:value-of select="SUBJ" /> (<xsl:value-of select="DEPT" />)</h2> -->  
                    <ul class="verysimplelist">        
                          <li style="font-size:150%; font-weight:400"><xsl:value-of select="SUBJ" /></li> 
                          <li style="font-size:150%; font-weight:400"><xsl:value-of select="COURSE_NUM"/> - </li> 
                          <li style="font-size:140%; font-weight:400; font-style:italic"><xsl:value-of select="TITLE"/></li>            
                          <li style="font-size:150%; font-weight:400">(<xsl:value-of select="MIN_CREDITS"/> Credits)</li>
                     </ul>
                    <p>              
                         <xsl:value-of select="DESCRIPTION" />
                    </p> 
                </xsl:for-each>
           </xsl:for-each>
           </div>
           </div>
           </div>
         </body>
     </html>
   </xsl:template>


 </xsl:stylesheet>