Xml XSLT1.0:将元素移动到父元素的底部并对其排序

Xml XSLT1.0:将元素移动到父元素的底部并对其排序,xml,xslt,xslt-1.0,Xml,Xslt,Xslt 1.0,我想将一些元素移动到其父元素的底部,并按属性“messageid”对它们进行排序 这是XML <Root> <parent> <child/> <child2 messageid="8"/> <child/> <child2 messageid="5"/> <child/> <child2 messageid="7"/> </parent> </Root> 下面是想要的X

我想将一些元素移动到其父元素的底部,并按属性“messageid”对它们进行排序

这是XML

<Root>
<parent>
<child/>
<child2 messageid="8"/>
<child/>
<child2 messageid="5"/>
<child/>
<child2 messageid="7"/>
</parent>
</Root>

下面是想要的XML输出

<Root>
<parent>
<child/>
<child/>
<child/>
<child2 messageid="5"/>
<child2 messageid="7"/>
<child2 messageid="8"/>
</parent>
</Root>


我想我需要使用xsl:copy,但我不知道怎么做。感谢您的帮助

类似的方法应该会奏效:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="parent">
    <xsl:copy>
      <xsl:copy-of select="@*" />
      <xsl:apply-templates select="*[not(self::child2)]" />
      <xsl:apply-templates select="child2">
        <xsl:sort data-type="number" select="@messageid" />
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

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

这可能更容易。
父节点上使用稍微修改的标识模板似乎可以完成以下任务:

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

  <!-- slightly modified identity template -->
  <xsl:template match="parent">
    <xsl:copy> 
      <xsl:apply-templates select="node()|@*">
        <xsl:sort select="@messageid"/>
      </xsl:apply-templates>
    </xsl:copy> 
  </xsl:template>

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

</xsl:stylesheet>


哪些应该在底部?元素是child2还是所有具有messageid属性的元素?应该只对底部的元素进行排序吗?对不起,是的,所有的child2元素必须在底部,并且它们必须按messageid进行排序。谢谢,只有当我删除排序中的mode=number:)@CRT正确时,该属性才应该被称为
数据类型
-修复了这个问题。请注意,如果没有,它将进行文本排序,例如,“10”被视为小于“2”。arf ok,但小于10被视为小于2。有办法解决这个问题吗?你说的应该被称为数据类型是什么意思?@CRT正如我所说的,我编辑了我的答案,答案就在那里(看看
xsl:sort
)。