Question

I have an XML File

<?xml version="1.0" encoding="UTF-8"?>
<data>

 <contact-information>

  <full-name>Peter John</full-name>
  <address_line_1>some place</address_line_1>
  <address_line_2>some place2</address_line_2>
  <city>some city</city>
  <state>some state</state>
  <zip>54000</zip>
  <country>some country</country>
  <phone>2121314144</phone>
  <email>abc@xyz.com</email>

</contact-information>

<professional-experience-section>
  <section-name>PROFESSIONAL EXPERIENCE</section-name>
  <enabled>true</enabled>
  <company>
    <name>Computer Sciences Corporation</name>
    <city>New York</city>
    <state>NY</state>
    <country>United States</country>
    <job-title>
      <title>Senior Software Engineer</title>
      <start-date>Aug 1996</start-date>
      <end-date>May 2010</end-date>
      <ongoing>false</ongoing>
      <job-description>
        <bullet-point>
          <statement>C#, Visual Basic, Asp.net</statement>
        </bullet-point>
        <bullet-point>
          <statement>Inspect completed work to ensure conformance to specifications, standards, and contract requirements.</statement>
        </bullet-point>
        <bullet-point>
          <statement>Another Work Description.</statement>
        </bullet-point>
      </job-description>
    </job-title>
  </company>
  <company>
    <name>Acme</name>
    <city>Silver Spring</city>
    <state>MD</state>
    <country>United States</country>
    <job-title>
      <title>Manager</title>
      <start-date>Jul 2010</start-date>
      <end-date>present</end-date>
      <ongoing>true</ongoing>
      <job-description>
        <bullet-point>
          <statement>Report to management regarding the finances of establishment.</statement>
        </bullet-point>
        <bullet-point>
          <statement>Prepare, examine, or analyze accounting records, financial statements, or other financial reports to assess accuracy, completeness, and conformance to reporting and procedural standards.</statement>
        </bullet-point>
        <bullet-point>
          <statement>Prepare, examine, or analyze accounting records, financial statements, or other financial reports to assess accuracy, completeness, and conformance to reporting and procedural standards.</statement>
        </bullet-point>
      </job-description>
    </job-title>

    <job-title>
      <title>Analyst</title>
      <start-date>Jul 2001</start-date>
      <end-date>Jan 2010</end-date>
      <ongoing>false</ongoing>
      <job-description>
        <bullet-point>
          <statement>Study and rehearse roles from scripts in order to interpret, learn and memorize lines, stunts, and cues as directed.</statement>
        </bullet-point>
        <bullet-point>
          <statement>Work closely with directors, other actors, and playwrights to find the interpretation most suited to the role.</statement>
        </bullet-point>
      </job-description>
    </job-title>

  </company>
</professional-experience-section>


<education-section>
  <section-name>EDUCATION</section-name>
  <enabled>true</enabled>
  <institution>
    <name>Allston Community College</name>
    <city>Akron</city>
    <state>MA</state>
    <country>United States</country>
    <degree>Bachelor of Art in Marketing Candidate</degree>
    <end-date>Jan 2020</end-date>
    <ongoing>true</ongoing>
    <expected-completion-date>Jan 2020</expected-completion-date>
    <completed></completed>
    <bullet-point>
      <statement>detail of what i did at the allston community college</statement>
    </bullet-point>
  </institution>
  <institution>
    <name>Boston College</name>
    <city>Boston</city>
    <state>MA</state>
    <country>United States</country>
    <degree>Bachelor of Science in Information Systems</degree>
    <end-date>Jul 1990</end-date>
    <ongoing>false</ongoing>
    <expected-completion-date></expected-completion-date>
    <completed>true</completed>
    <bullet-point>
      <statement>Lorem Ipsum</statement>
    </bullet-point>
  </institution>
  <institution>
    <name>Testing</name>
    <city>Testing</city>
    <state>PA</state>
    <country>United States</country>
    <degree>Completed coursework towards Bachelor of Art in Marketing</degree>
    <end-date>Mar 1963</end-date>
    <ongoing>false</ongoing>
    <expected-completion-date></expected-completion-date>
    <completed>false</completed>
    <bullet-point>
      <statement>Lorem Ipsum</statement>
    </bullet-point>
  </institution>
  <institution>
    <name>Testing</name>
    <city>Testing</city>
    <state>PA</state>
    <country>United States</country>
    <degree>Completed coursework towards Bachelor of Art in Marketing</degree>
    <end-date>Mar 1963</end-date>
    <ongoing>false</ongoing>
    <expected-completion-date></expected-completion-date>
    <completed>false</completed>
    <bullet-point>
      <statement>Lorem Ipsum</statement>
    </bullet-point>
  </institution>
</education-section>
<additional-skills-section>
  <section-name>ADDITIONAL SKILLS</section-name>
  <enabled>true</enabled>
  <layout>1 Column</layout>
  <bullet-point>
    <statement>Additional Skills 1</statement>
  </bullet-point>
   </additional-skills-section>
<custom-section>
  <section-name>PUBLICATIONS</section-name>
  <layout>2</layout>
  <bullet-point>
    <statement>test</statement>
  </bullet-point>
 </custom-section>

</data>

As you can see this file contains different sections, contact-information, professional and education?

I want to sort these sections using xsl.

By sorting i mean that i want the professional section to appear first in the transformed xml when xsl transformation is applied.

How can i do that in xsl? How are xml elements parsed? Meaning priority?

Was it helpful?

Solution

This transformation:

<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:param name="pRanks">
  <professional-experience-section r="1"/>
  <education-section r="2"/>
  <additional-skills-section r="3"/>
  <custom-section r="4"/>
  <contact-information r="5"/>
 </xsl:param>

 <xsl:variable name="vRanks" select=
     "document('')/*/xsl:param[@name='pRanks']"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="/*">
  <xsl:apply-templates select="*">
   <xsl:sort select="$vRanks/*[name()=name(current())]/@r"
             data-type="number"/>
  </xsl:apply-templates>
 </xsl:template>
</xsl:stylesheet>

when applied on the provided XML document, produces the sorted result as per the rankings specified in the pRanks parameter:

<professional-experience-section>
   <section-name>PROFESSIONAL EXPERIENCE</section-name>
   <enabled>true</enabled>
   <company>
      <name>Computer Sciences Corporation</name>
      <city>New York</city>
      <state>NY</state>
      <country>United States</country>
      <job-title>
         <title>Senior Software Engineer</title>
         <start-date>Aug 1996</start-date>
         <end-date>May 2010</end-date>
         <ongoing>false</ongoing>
         <job-description>
            <bullet-point>
               <statement>C#, Visual Basic, Asp.net</statement>
            </bullet-point>
            <bullet-point>
               <statement>Inspect completed work to ensure conformance to specifications, standards, and contract requirements.</statement>
            </bullet-point>
            <bullet-point>
               <statement>Another Work Description.</statement>
            </bullet-point>
         </job-description>
      </job-title>
   </company>
   <company>
      <name>Acme</name>
      <city>Silver Spring</city>
      <state>MD</state>
      <country>United States</country>
      <job-title>
         <title>Manager</title>
         <start-date>Jul 2010</start-date>
         <end-date>present</end-date>
         <ongoing>true</ongoing>
         <job-description>
            <bullet-point>
               <statement>Report to management regarding the finances of establishment.</statement>
            </bullet-point>
            <bullet-point>
               <statement>Prepare, examine, or analyze accounting records, financial statements, or other financial reports to assess accuracy, completeness, and conformance to reporting and procedural standards.</statement>
            </bullet-point>
            <bullet-point>
               <statement>Prepare, examine, or analyze accounting records, financial statements, or other financial reports to assess accuracy, completeness, and conformance to reporting and procedural standards.</statement>
            </bullet-point>
         </job-description>
      </job-title>
      <job-title>
         <title>Analyst</title>
         <start-date>Jul 2001</start-date>
         <end-date>Jan 2010</end-date>
         <ongoing>false</ongoing>
         <job-description>
            <bullet-point>
               <statement>Study and rehearse roles from scripts in order to interpret, learn and memorize lines, stunts, and cues as directed.</statement>
            </bullet-point>
            <bullet-point>
               <statement>Work closely with directors, other actors, and playwrights to find the interpretation most suited to the role.</statement>
            </bullet-point>
         </job-description>
      </job-title>
   </company>
</professional-experience-section>
<education-section>
   <section-name>EDUCATION</section-name>
   <enabled>true</enabled>
   <institution>
      <name>Allston Community College</name>
      <city>Akron</city>
      <state>MA</state>
      <country>United States</country>
      <degree>Bachelor of Art in Marketing Candidate</degree>
      <end-date>Jan 2020</end-date>
      <ongoing>true</ongoing>
      <expected-completion-date>Jan 2020</expected-completion-date>
      <completed/>
      <bullet-point>
         <statement>detail of what i did at the allston community college</statement>
      </bullet-point>
   </institution>
   <institution>
      <name>Boston College</name>
      <city>Boston</city>
      <state>MA</state>
      <country>United States</country>
      <degree>Bachelor of Science in Information Systems</degree>
      <end-date>Jul 1990</end-date>
      <ongoing>false</ongoing>
      <expected-completion-date/>
      <completed>true</completed>
      <bullet-point>
         <statement>Lorem Ipsum</statement>
      </bullet-point>
   </institution>
   <institution>
      <name>Testing</name>
      <city>Testing</city>
      <state>PA</state>
      <country>United States</country>
      <degree>Completed coursework towards Bachelor of Art in Marketing</degree>
      <end-date>Mar 1963</end-date>
      <ongoing>false</ongoing>
      <expected-completion-date/>
      <completed>false</completed>
      <bullet-point>
         <statement>Lorem Ipsum</statement>
      </bullet-point>
   </institution>
   <institution>
      <name>Testing</name>
      <city>Testing</city>
      <state>PA</state>
      <country>United States</country>
      <degree>Completed coursework towards Bachelor of Art in Marketing</degree>
      <end-date>Mar 1963</end-date>
      <ongoing>false</ongoing>
      <expected-completion-date/>
      <completed>false</completed>
      <bullet-point>
         <statement>Lorem Ipsum</statement>
      </bullet-point>
   </institution>
</education-section>
<additional-skills-section>
   <section-name>ADDITIONAL SKILLS</section-name>
   <enabled>true</enabled>
   <layout>1 Column</layout>
   <bullet-point>
      <statement>Additional Skills 1</statement>
   </bullet-point>
</additional-skills-section>
<custom-section>
   <section-name>PUBLICATIONS</section-name>
   <layout>2</layout>
   <bullet-point>
      <statement>test</statement>
   </bullet-point>
</custom-section>
<contact-information>
   <full-name>Peter John</full-name>
   <address_line_1>some place</address_line_1>
   <address_line_2>some place2</address_line_2>
   <city>some city</city>
   <state>some state</state>
   <zip>54000</zip>
   <country>some country</country>
   <phone>2121314144</phone>
   <email>abc@xyz.com</email>
</contact-information>

Do note: The $pRanks parameter can be specified externally so that the transformation will never need to be edited.

OTHER TIPS

This stylesheet modifying a litle the identity rule:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:apply-templates select="node()">
                <xsl:sort select="not(self::professional-experience-section)"/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Well without a root element your markup is not a well-formed XML document. And if you want us to help with XSLT then we also need to know what the root element is. Assuming you have an element named "data" wrapping those elements you have posted and you want to reorder them with XSLT 1.0 then do

<xsl:template match="data">
  <xsl:copy>
    <xsl:copy-of select="professional-experience-section"/>
    <xsl:copy-of select="*[not(self::professional-experience-section)]"/>
  </xsl:copy>
</xsl:template>
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top