Xml XSLT2.0中的元素排序

Xml XSLT2.0中的元素排序,xml,sorting,xslt,xslt-2.0,Xml,Sorting,Xslt,Xslt 2.0,我正在尝试使用XSLT对以下XML进行排序 <Name>name3</Name> <Job>x</Job> <Name>name1</Name> <Job>y</Job> <Name>name2</Name> name3 x 名称1 Y 姓名2 预期产量为 <Name>name1</Name> <Job>x</Job>

我正在尝试使用XSLT对以下XML进行排序

<Name>name3</Name>
<Job>x</Job> 
<Name>name1</Name>
<Job>y</Job> 
<Name>name2</Name>
name3
x
名称1
Y
姓名2
预期产量为

<Name>name1</Name>
<Job>x</Job> 
<Name>name2</Name>
<Job>y</Job> 
<Name>name3</Name>
name1
x
姓名2
Y
名字3
必须对名称元素进行排序,同时保持作业元素的完整性。 我正在使用XSLT2.0

尽管我能够使用中给出的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>
name1
姓名2
名字3
名字3
x
名称1
Y
姓名2
我是XSLT新手。对不起,如果这是一个非常简单的问题。 提前谢谢

对不起,如果这是一个非常简单的问题

不,这一点都不简单。试着这样做:

XSLT2.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输入,只有一个根元素


演示:

此部分不清楚:“同时保持作业元素完整”。请更改示例并为每个作业指定不同的值(或唯一id),这样我们就可以知道哪个是哪个。我已经更新了这个例子。如果你不告诉我们你做了什么,我们就不能告诉你你做错了什么。对于排序,你可以使用
执行排序
,而不是每个@MartinHonnen的
,这有什么好处吗?你可以节省一行代码,并且可以利用XSLT 2.0的特性排序一个序列。@MartinHonnen“你会保存一行代码”啊,你说得对。我已经编辑了我的答案,谢谢。@michael.hor257k非常感谢!