You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅对XML父节点内指定子节点排序并保留其他节点位置?

需求:仅排序下的节点,保留其他子节点原有位置

输入XML

<?xml version="1.0" encoding="UTF-8"?>
<Companies>
  <badCompany>badCompany</badCompany>
  <badCompany>badCompany2</badCompany>
   <company>Toyota</company>
   <company>Mercedes</company>
   <company>BMW</company>
   <company>Mazda</company>
   <badCompany>badCompany3</badCompany>
</Companies>

期望输出XML

<?xml version="1.0" encoding="UTF-8"?>
    <Companies>
      <badCompany>badCompany</badCompany>
      <badCompany>badCompany2</badCompany>
      <company>BMW</company>   
      <company>Mazda</company>
      <company>Mercedes</company>
      <company>Toyota</company> 
      <badCompany>badCompany3</badCompany>
</Companies>

当前问题代码

现有XSLT会对下所有子节点排序,无法保留等节点的原有位置:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns1="http://sap.com/xi/SAPGlobal20/Global" xmlns:n1="http://sap.com/xi/EWM/Global" version="2.0">
    <xsl:output encoding="UTF-8" method="xml" version="1.0"/>
  <xsl:template match="Companies">
    <xsl:copy>
      <xsl:apply-templates>
        <xsl:sort/>
      </xsl:apply-templates>
        </xsl:copy>

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

</xsl:stylesheet>

修正后的XSLT代码

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns1="http://sap.com/xi/SAPGlobal20/Global" xmlns:n1="http://sap.com/xi/EWM/Global" version="2.0">
    <xsl:output encoding="UTF-8" method="xml" version="1.0" indent="yes"/>
    
    <xsl:template match="Companies">
        <xsl:copy>
            <!-- 先按原顺序输出所有非company的子节点 -->
            <xsl:apply-templates select="*[not(self::company)]"/>
            <!-- 提取所有company节点并排序后输出 -->
            <xsl:apply-templates select="company">
                <xsl:sort/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>
    
    <!-- 默认复制模板:保留所有节点、属性和文本的原样结构 -->
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

代码说明

  1. 针对节点分两步处理子节点:
    • 用*[not(self::company)]筛选出所有非的子节点,按原有顺序直接输出
    • 单独提取节点,通过<xsl:sort/>按文本内容排序后输出
  2. 保留默认的节点/属性复制模板,确保XML的其他结构(如命名空间、文本内容)不受影响
  3. 添加indent="yes"让输出XML格式更规整,与期望输出对齐

内容的提问来源于stack exchange,提问作者dziq45

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 23:45:42