首页 > 解决方案 > 如何使用 XSLT 交换两个 XML 节点?

问题描述

下面是我的源 XML,

    <Employee>
       <Position>
          <Operation>ADD</Operation>
          <ID>9876</ID>
       <Position>
       <Position>
          <Operation>REMOVE</Operation>
          <ID>1234</ID>
       <Position>
    <Employee>

需要将上面的代码转换成下面的代码,

    <Employee>
       <Position>
          <Operation>REMOVE</Operation>
          <ID>1234</ID>
       <Position>
       <Position>
          <Operation>ADD</Operation>
          <ID>9876</ID>
       <Position>
    <Employee>

基本上需要交换这样的位置,首先出现 REMOVE,然后出现 ADD。提前致谢。

标签: xmlxslt

解决方案


请尝试以下 XSLT。它使用所谓的身份转换模式。

Employee元素的模板根据其子元素Operation值指定Position元素的顺序。

XML

<?xml version="1.0"?>
<Employee>
    <Position>
        <Operation>ADD</Operation>
        <ID>9876</ID>
    </Position>
    <Position>
        <Operation>REMOVE</Operation>
        <ID>1234</ID>
    </Position>
</Employee>

XSLT

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

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

    <xsl:template match='Employee'>
        <xsl:copy>
            <xsl:apply-templates select="Position[Operation='REMOVE']"/>
            <xsl:apply-templates select="Position[Operation='ADD']"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

输出

<?xml version="1.0" encoding="utf-8"?>
<Employee>
  <Position>
    <Operation>REMOVE</Operation>
    <ID>1234</ID>
  </Position>
  <Position>
    <Operation>ADD</Operation>
    <ID>9876</ID>
  </Position>
</Employee>

推荐阅读