xml - 如何对该XML进行排序?

标签 xml xslt xpath

这是我要排序的XML:

<?xml version="1.0" encoding="utf-8"?>
<Proposal>
  <MobileKey>test string</MobileKey>
  <RevisionNumber>9</RevisionNumber>
  <CreationDate>2014-04-30T13:21:00</CreationDate>
  <ProposalDueDate>test string</ProposalDueDate>
  <ProposalJobs>
    <ProposalID>56</ProposalID>
    <ProposalRevision>9</ProposalRevision>
    <ProposalJobNumber>9</ProposalJobNumber>
    <ServiceLine>test string</ServiceLine>
    <SubServiceLine>test string</SubServiceLine>
  </ProposalJobs>
  <ProposalJobs>
    <ProposalID>42</ProposalID>
    <ProposalRevision>9</ProposalRevision>
    <ProposalJobNumber>9</ProposalJobNumber>
    <ServiceLine>test string</ServiceLine>
    <SubServiceLine>test string</SubServiceLine>
  </ProposalJobs>
  <ProposalJobs>
    <ProposalID>21</ProposalID>
    <ProposalRevision>9</ProposalRevision>
    <ProposalJobNumber>9</ProposalJobNumber>
    <ServiceLine>test string</ServiceLine>
    <SubServiceLine>test string</SubServiceLine>
  </ProposalJobs>
</Proposal>


输出应为(按ProposalID排序):

<?xml version="1.0" encoding="utf-8"?>
<Proposal>
  <MobileKey>test string</MobileKey>
  <RevisionNumber>9</RevisionNumber>
  <CreationDate>2014-04-30T13:21:00</CreationDate>
  <ProposalDueDate>test string</ProposalDueDate>
  <ProposalJobs>
    <ProposalID>21</ProposalID>
    <ProposalRevision>9</ProposalRevision>
    <ProposalJobNumber>9</ProposalJobNumber>
    <ServiceLine>test string</ServiceLine>
    <SubServiceLine>test string</SubServiceLine>
  </ProposalJobs>
  <ProposalJobs>
    <ProposalID>42</ProposalID>
    <ProposalRevision>9</ProposalRevision>
    <ProposalJobNumber>9</ProposalJobNumber>
    <ServiceLine>test string</ServiceLine>
    <SubServiceLine>test string</SubServiceLine>
  </ProposalJobs>
  <ProposalJobs>
    <ProposalID>56</ProposalID>
    <ProposalRevision>9</ProposalRevision>
    <ProposalJobNumber>9</ProposalJobNumber>
    <ServiceLine>test string</ServiceLine>
    <SubServiceLine>test string</SubServiceLine>
  </ProposalJobs>
</Proposal>


我使用了以下XSLT。它可以正确排序,但会删除Proposal节点以外的所有ProposalJobs子元素。请在这里帮助我:

<?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"
>
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="Proposal">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:apply-templates select="ProposalJobs">
        <xsl:sort select="ProposalID"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

最佳答案

更改此:

<xsl:apply-templates select="ProposalJobs">
    <xsl:sort select="ProposalID"/>
</xsl:apply-templates>


至:

<xsl:apply-templates select="*">
    <xsl:sort select="ProposalID"/>
</xsl:apply-templates>




或者,添加以下内容:

<xsl:apply-templates select="*[not(self::ProposalJobs)]"/>


之前:

<xsl:apply-templates select="ProposalJobs">
    <xsl:sort select="ProposalID"/>
</xsl:apply-templates>




与您的问题无关,但您应该更改此设置:

<xsl:sort select="ProposalID"/>


至:

<xsl:sort select="ProposalID" data-type="number"/>


否则,提案ID#101将在#21之前。



编辑:

要保留内部“块”的顺序,请使用:

<xsl:template match="Proposal">   
    <xsl:copy>
        <xsl:apply-templates select="@*|node()[not(preceding-sibling::ProposalJobs)]"/>
        <xsl:apply-templates select="ProposalJobs">
            <xsl:sort select="ProposalID" data-type="number"/>
        </xsl:apply-templates>
        <xsl:apply-templates select="node()[preceding-sibling::ProposalJobs]"/>
    </xsl:copy>  
</xsl:template>

关于xml - 如何对该XML进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25497552/

相关文章:

c# - 基于xml文件生成C#对象?

python - 比较 lxml 中祖先元素的子元素

java - java中的xslt转换,属性值未编码

java - Selenium 非常相似的xpaths?

java - 来自 xpath-splitter 的消息是否有序?

Java Selenium - 使用 xpath 从具有相同类名的多个 div 中查找字符串文本

java - writeStartElement 有 prvoide namespaceURI,为什么需要另一个 writeNamespace?

php - 以最简单、最整洁的方式一页可编辑列表

xslt - 用于在 Windows 上定位相对文件路径的 XSL 导入用法

xml - 如何在远程服务器上使用 XSL 呈现本地 XML