这是我要排序的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/