XSLT 1.0 :将元素移动到父元素的底部并对其进行排序



我想将一些元素移动到其父元素的底部,并按属性"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>

相关内容

  • 没有找到相关文章

最新更新