我想将一些元素移动到其父元素的底部,并按属性"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>
这可能更容易。
在parent
节点上使用稍作修改的身份模板似乎可以完成这项工作:
<?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>