0

I am displaying my XML using XSLT

My XML looks like this

    <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>

My XSLT looks like this

<?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>

So using for-each works for me and I'm getting the desired output however I would like some additional functionality.

I would like them to be grouped still alphabetically but by <DEPT> with the dept name at the top of each group in a h2 tag or something like that. I can't seem to get this to work. Any Ideas? Thanks!

6
  • You are looking for Muenchian grouping. Commented Sep 5, 2017 at 20:10
  • Using the exslt:node-set makes life a lot easier. Commented Sep 5, 2017 at 20:14
  • I agree with zx485 that this sounds like a grouping issue. Can you add a couple more DATA_RECORD's to your input and also add a desired output example? This will help us see what you're trying to group and sort. It should be pretty easy to get you an example of muenchian grouping. Commented Sep 5, 2017 at 20:50
  • 1
    I edited in both DATA_RECORDs. Commented Sep 5, 2017 at 20:59
  • Sorry, I meant more DATA_RECORD's with the same dept's so we could see the grouping. Right now there's nothing to group; they all have unique departments. Commented Sep 5, 2017 at 21:05

1 Answer 1

1

As mentioned, in XSLT 1.0, consider the Muenchian Grouping where you index the document by a certain key <xsl:key>, then generate groupings and map corresponding nodes under same group.

Below adds a <h2> tag for each Dept as headers above the output of other <DATA_RECORD> nodes.

<?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>
Sign up to request clarification or add additional context in comments.

4 Comments

Hmmm. What doesn't work? This example assumes root is <main> (which you do not include in post). In fact, your root may have namespaces. Please edit XML. Roots are very important in XML documents. Always include for full reproducible examples.
Hey Thanks again! I updated the XML... <main> is the root so that's weird.
Does anything have to change in the top of the XSLT in this part <xsl:stylesheet version="1.0" xmlns:xsl="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"/>
@dbaker6 - If by "cant get it to work" you mean you get a bunch of html structures with empty div's, you need to move the html up to the template that matches main. See here: xsltransform.net/ehVYZNA

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.