【问题标题】:XML Sorting Using XSL使用 XSL 进行 XML 排序
【发布时间】:2010-11-18 12:57:06
【问题描述】:

我有一个 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元素是如何解析的?意思是优先?

【问题讨论】:

  • 告诉我们你现在是如何解析它们的,所以我们可以从那里开始......
  • 好问题,+1。有关完全可定制和参数化的完整且简短的解决方案,请参阅我的答案。
  • 你好像没看过我的回答?

标签: xml xslt xslt-1.0


【解决方案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】:

    这个样式表修改了一点身份规则:

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

    【讨论】:

    • 这只是对专业经验部分进行排序,如果我想根据任何部分进行排序
    • @Sultan Saadat:你测试了吗?这正是您所要求的:By sorting i mean that i want the professional section to appear first in the transformed xml.
    • 这还有一个好处是您可以用其他规则覆盖身份规则,因此转换工作就像输入源按此顺序一样(当然,data 除外)。跨度>
    【解决方案3】:

    如果没有根元素,您的标记就不是格式良好的 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>
    

    【讨论】:

    • 我的根元素是数据元素,你的代码在做什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 2013-06-14
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多