【问题标题】:xml elements positionxml元素位置
【发布时间】:2011-05-13 12:04:35
【问题描述】:

这是一个xml文件

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

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

这个 xml 文件由以下 xsl 转换:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/resume">
    <xsl:value-of select="/resume/contact-information/full-name"/>
    <xsl:value-of select="/resume/contact-information/address_line_1"/>
    <xsl:value-of select="/resume/contact-information/address_line_2"/>
    <xsl:value-of select="/resume/contact-information/city"/>
    <xsl:value-of select="/resume/contact-information/state"/>
    <xsl:value-of select="/resume/contact-information/country"/>
    <xsl:value-of select="/resume/contact-information/phone"/>

    <xsl:for-each select="/resume/professional-experience-section/company"> 
        <!--for company name-->
        <xsl:value-of select="name"/>
        <xsl:value-of select="city"/>, <xsl:value-of select="state"/>
        <xsl:value-of select="country"/>
        <!--loop into job title-->
        <xsl:for-each select="job-title"> 
            <!--for job title-->
            <xsl:value-of select="title"/> 
            <!--for job start date and job end date-->
            <xsl:value-of select="start-date"/> – <xsl:value-of
                select="end-date"/>
            <!--Loop into job description-->
            <xsl:for-each select="job-description"> 
                <!--loop into each bullet point-->
                <xsl:for-each select="bullet-point">
                    <xsl:value-of select="statement"/>
                </xsl:for-each>
            </xsl:for-each>
        </xsl:for-each>
    </xsl:for-each>


    <!--education section-->
    <!--for education section's section name-->
    <xsl:value-of select="/resume/education-section/section-name"/>
    <!--loop into each institution name-->
    <xsl:for-each select="/resume/education-section/institution"> 
        <!--for institution name  -->
        <xsl:value-of select="name"/>
        <!--for institution city and state-->
        <xsl:value-of select="city"/>, <xsl:value-of select="state"/>
        <xsl:value-of select="country"/>
        <!--for degree of a particular institution-->
        <xsl:value-of select="degree"/>-<xsl:value-of select="expected-completion-date"/>
        <xsl:for-each select="bullet-point">
            <xsl:for-each select="statement" >
                <xsl:value-of select="."/>
            </xsl:for-each>
        </xsl:for-each>
    </xsl:for-each>


</xsl:template>

专业部分将始终在教育部分之前呈现。我想开发一种可以在 xsl 中更改部分的机制,例如,如果我希望通过使用某种输入首先显示教育部分的信息而不是专业信息,而我不必手动进行。我应该如何更改 xml 或 xsl 文件,以便我可以在运行时更改上面列出的 xsl 中每个部分的顺序?

【问题讨论】:

  • 好问题,+1。请参阅我的答案以获得快速且完全参数化的解决方案。 :)

标签: .net xml xslt xsd xslt-1.0


【解决方案1】:

有两个独立的 xsl 样式表;一个如上,另一个与

<xsl:value-of select="/resume/education-section/section-name"/>

领先于专业经验循环。

在运行时,决定要调用哪个样式表。

这真的不是一个聪明的回答,我真的认为这是实现提问者想要的最好方法

【讨论】:

  • 我也想过这个有多个样式表,但假设如果我有超过 2 个部分,我需要做多少组合?
【解决方案2】:

以下转换使用外部参数(并且可以轻松调整以从另一个文档中读取)所需的部分及其所需的顺序

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:param name="pRanks">
  <section name="contact-information" r="1"/>
  <section name="professional-experience-section" r="2"/>
  <section name="education-section" r="3"/>
 </xsl:param>

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

 <xsl:template match="/resume">

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

 <xsl:template match="contact-information">
    <xsl:value-of select="full-name"/>
    <xsl:value-of select="address_line_1"/>
    <xsl:value-of select="address_line_2"/>
    <xsl:value-of select="city"/>
    <xsl:value-of select="state"/>
    <xsl:value-of select="country"/>
    <xsl:value-of select="phone"/>
 </xsl:template>

 <xsl:template match="company">
  <!--for company name-->
  <xsl:value-of select="name"/>
  <xsl:value-of select="city"/>, <xsl:value-of select="state"/>
  <xsl:value-of select="country"/>
  <!--loop into job title-->
  <xsl:for-each select="job-title">
    <!--for job title-->
    <xsl:value-of select="title"/>
      <!--for job start date and job end date-->
      <xsl:value-of select="start-date"/> – <xsl:value-of
           select="end-date"/>
       <!--Loop into job description-->
       <xsl:for-each select="job-description">
          <!--loop into each bullet point-->
          <xsl:for-each select="bullet-point">
            <xsl:value-of select="statement"/>
          </xsl:for-each>
       </xsl:for-each>
    </xsl:for-each>
 </xsl:template>

 <xsl:template match="institution">
  <!--for institution name  -->
  <xsl:value-of select="name"/>
  <!--for institution city and state-->
  <xsl:value-of select="city"/>, <xsl:value-of select="state"/>
  <xsl:value-of select="country"/>
  <!--for degree of a particular institution-->
  <xsl:value-of select="degree"/>-<xsl:value-of select="expected-completion-date"/>
  <xsl:for-each select="bullet-point">
    <xsl:for-each select="statement" >
      <xsl:value-of select="."/>
    </xsl:for-each>
   </xsl:for-each>
 </xsl:template>

 <xsl:template match="education-section">
    <!--education section-->
    <!--for education section's section name-->
    <xsl:value-of select="section-name"/>
    <!--loop into each institution name-->
    <xsl:apply-templates select="institution"/>
 </xsl:template>
</xsl:stylesheet>

请注意

我没有更正所提供的任何特定处理——只是将其分组到模板中并提供了排序机制。由 OP(原始海报)决定如何完成演示文稿。

特别是,大部分代码仍然可以通过将其分组到模板中进行优化,这将允许解耦代码、简化代码并减少依赖关系和硬编码信息。

【讨论】:

    【解决方案3】:

    这个样式表:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:param name="pOrder" select="concat('contact-information|',
                                                'professional-experience-section|',
                                                'education-section')"/>
        <xsl:template match="institution/completed|
                             institution/end-date|
                             institution/ongoing|
                             education-section/enable|
                             professional-experience-section
                                /*[not(self::company)]|
                             custom-section|
                             additional-skills-section|
                             contact-information/zip|
                             contact-information/email|
                             job-title/ongoing" priority="1"/>
        <xsl:template match="text()">
            <xsl:value-of select="concat(.,'&#xa;')"/>
        </xsl:template>
        <xsl:template match="resume">
            <xsl:apply-templates>
                <xsl:sort select="string-length(
                                     substring-before($pOrder,
                                                      name()))"/>
            </xsl:apply-templates>
        </xsl:template>
        <xsl:template match="institution/city|company/city">
            <xsl:value-of select="concat(.,',')"/>
        </xsl:template>
        <xsl:template match="job-title/start-date">
            <xsl:value-of select="concat(.,' - ')"/>
        </xsl:template>
        <xsl:template match="institution/degree">
            <xsl:value-of select="concat(.,'-')"/>
        </xsl:template>
    </xsl:stylesheet>
    

    有了这个格式正确的输入(resume 根元素),输出:

    Peter John
    some place
    some place2
    some city
    some state
    some country
    2121314144
    Computer Sciences Corporation
    New York,NY
    United States
    Senior Software Engineer
    Aug 1996 - May 2010
    C#, Visual Basic, Asp.net
    Inspect completed work to ensure conformance to specifications, standards, and contract requirements.
    Another Work Description.
    Acme
    Silver Spring,MD
    United States
    Manager
    Jul 2010 - present
    Report to management regarding the finances of establishment.
    Prepare, examine, or analyze accounting records, financial statements, or other financial reports to assess accuracy, completeness, and conformance to reporting and procedural standards.
    Prepare, examine, or analyze accounting records, financial statements, or other financial reports to assess accuracy, completeness, and conformance to reporting and procedural standards.
    Analyst
    Jul 2001 - Jan 2010
    Study and rehearse roles from scripts in order to interpret, learn and memorize lines, stunts, and cues as directed.
    Work closely with directors, other actors, and playwrights to find the interpretation most suited to the role.
    EDUCATION
    true
    Allston Community College
    Akron,MA
    United States
    Bachelor of Art in Marketing Candidate-Jan 2020
    detail of what i did at the allston community college
    Boston College
    Boston,MA
    United States
    Bachelor of Science in Information Systems-Lorem Ipsum
    Testing
    Testing,PA
    United States
    Completed coursework towards Bachelor of Art in Marketing-Lorem Ipsum
    Testing
    Testing,PA
    United States
    Completed coursework towards Bachelor of Art in Marketing-Lorem Ipsum
    

    注意$pOrderparam 是一个序列,具有处理resumechildren 的相对顺序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-10
      • 1970-01-01
      相关资源
      最近更新 更多