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

求助:使用XSLT实现XML按Effective_Change拆分并排序转换

XSLT转换需求:拆分worker节点并按时间排序

需求要点

  • 将每个包含多个<Effective_Change>的<worker>节点拆分为多个独立worker节点,每个新worker对应一个原Effective_Change
  • 所有拆分后的worker节点需按其关联的<Effective_Change>/<time>值升序排列
  • 保留原<company>/<summary>节点,新worker继承原worker的<worker_summary>内容
  • 移除拆分后User 1的<Effective_Change>的sequence属性,并去除其<example>/<content>文本开头的User 1 前缀

输入XML

<?xml version="1.0" encoding="UTF-8"?>
<company>
    <summary>
        <company_name>C1</company_name>
    </summary>
    <worker>
        <worker_summary>
            <Name>User 1</Name>
        </worker_summary>
        <Effective_Change sequence="0">
            <time>2022-01-01T07:00:00.000-09:00</time>
            <example>
                <content>User 1 Example 1 Content</content>
            </example>
        </Effective_Change>
        <Effective_Change sequence="1">
            <time>2022-01-01T02:00:00.000-09:00</time>
            <example>
                <content>User 1 Example 2 Content</content>
            </example>
        </Effective_Change>
    </worker>
    <worker>
        <worker_summary>
            <Name>User 2</Name>
        </worker_summary>
        <Effective_Change sequence="0">
            <time>2022-02-01T11:00:00.000-09:00</time>
            <example>
                <content>User 2 Example 1 Content</content>
            </example>
        </Effective_Change>
    </worker>
</company>

期望输出XML

<?xml version="1.0" encoding="UTF-8"?>
<company>
    <summary>
        <company_name>C1</company_name>
    </summary>
    <worker>
        <worker_summary>
            <Name>User 1</Name>
        </worker_summary>
        <Effective_Change>
            <time>2022-01-01T02:00:00.000-09:00</time>
            <example>
                <content>Example 1 Content</content>
            </example>
        </Effective_Change>
    </worker>
    <worker>
        <worker_summary>
            <Name>User 1</Name>
        </worker_summary>
        <Effective_Change>
            <time>2022-01-01T07:00:00.000-09:00</time>
            <example>
                <content>Example 2 Content</content>
            </example>
        </Effective_Change>
    </worker>
    <worker>
        <worker_summary>
            <Name>User 2</Name>
        </worker_summary>
        <Effective_Change sequence="0">
            <time>2022-02-01T11:00:00.000-09:00</time>
            <example>
                <content>User 2 Example 1 Content</content>
            </example>
        </Effective_Change>
    </worker>
</company>

实现XSLT代码

<?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" encoding="UTF-8"/>

    <!-- 复制所有未匹配的节点,保留summary等原始内容 -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <!-- 处理worker节点,替换为拆分后的多个worker -->
    <xsl:template match="worker">
        <xsl:apply-templates select="Effective_Change">
            <!-- 按time节点文本值升序排序 -->
            <xsl:sort select="time" data-type="text" order="ascending"/>
        </xsl:apply-templates>
    </xsl:template>

    <!-- 将每个Effective_Change转换为新的worker节点 -->
    <xsl:template match="Effective_Change">
        <worker>
            <!-- 复制原worker的worker_summary -->
            <xsl:copy-of select="../worker_summary"/>
            <Effective_Change>
                <!-- User 1的Effective_Change移除sequence属性,其他保留 -->
                <xsl:if test="../worker_summary/Name != 'User 1'">
                    <xsl:copy-of select="@*"/>
                </xsl:if>
                <!-- 复制time节点 -->
                <xsl:copy-of select="time"/>
                <example>
                    <content>
                        <!-- User 1的content移除开头的"User 1 "前缀 -->
                        <xsl:choose>
                            <xsl:when test="../worker_summary/Name = 'User 1'">
                                <xsl:value-of select="substring-after(example/content, 'User 1 ')"/>
                            </xsl:when>
                            <xsl:otherwise>
                                <xsl:value-of select="example/content"/>
                            </xsl:otherwise>
                        </xsl:choose>
                    </content>
                </example>
            </Effective_Change>
        </worker>
    </xsl:template>
</xsl:stylesheet>

代码说明

  1. 基础复制逻辑:默认模板复制所有未特殊处理的节点,确保<summary>等原始内容完整保留
  2. worker拆分与排序:匹配原<worker>节点后,遍历其下的<Effective_Change>并按<time>值升序排列
  3. 新worker生成:每个排序后的<Effective_Change>对应生成一个新<worker>,复制原worker的<worker_summary>
  4. 特殊节点处理:针对User 1的节点,移除<Effective_Change>的sequence属性并截断<content>开头的用户名前缀;User 2的节点保留原有属性和文本

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 13:01:18