使用XSL进行XML排序

时间:2010-11-18 12:57:07

标签: xml xslt xslt-1.0

我有一个XML文件

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

正如您所看到的,此文件包含不同的部分,联系信息,专业和教育?

我想使用xsl对这些部分进行排序。

通过排序我的意思是我希望专业部分在应用xsl转换时首先出现在转换后的xml中。

我怎样才能在xsl中这样做?如何解析xml元素?意义优先?

3 个答案:

答案 0 :(得分:1)

此样式表修改了身份规则:

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

答案 1 :(得分:1)

此转化

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

应用于提供的XML文档时,会根据pRanks参数中指定的排名生成排序结果:

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

请注意:可以在外部指定$pRanks参数,以便永远不需要编辑转换。

答案 2 :(得分:0)

没有根元素,您的标记不是格式良好的XML文档。如果您希望我们帮助XSLT,那么我们还需要知道根元素是什么。假设你有一个名为“data”的元素包装你发布的那些元素,你想用XSLT 1.0对它们重新排序,那么就做

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