在 XSLT 2.0 中对元素进行排序

Sorting elements in XSLT 2.0

我正在尝试使用 XSLT

对以下 XML 进行排序
<Name>name3</Name>
<Job>x</Job> 
<Name>name1</Name>
<Job>y</Job> 
<Name>name2</Name>

预期输出是

<Name>name1</Name>
<Job>x</Job> 
<Name>name2</Name>
<Job>y</Job> 
<Name>name3</Name>

必须对 Name 元素进行排序,同时保持 Job 元素的完整性。 我正在使用 XSLT 2.0

尽管我能够使用 tutorial 中给出的 xsl:sort 正确排序 Name 元素,但我得到的输出如下:

<Name>name1</Name>
<Name>name2</Name>
<Name>name3</Name>
<Name>name3</Name>
<Job>x</Job> 
<Name>name1</Name>
<Job>y</Job> 
<Name>name2</Name>

我是 XSLT 的新手。抱歉,如果这是一个非常简单的问题。 提前致谢。

Sorry, if this is a very simple question.

不,这一点都不简单。试试这个方法:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:variable name="sorted-names">
    <xsl:perform-sort select="/root/Name">
        <xsl:sort select="."/>
    </xsl:perform-sort>
</xsl:variable>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="Name">
    <xsl:copy-of select="$sorted-names/Name[count(current()/preceding-sibling::Name) + 1]"/>
</xsl:template>

</xsl:stylesheet>

请注意,这假定一个格式正确的 XML 输入,具有单个根元素。

演示:http://xsltransform.net/94hvTzG/1