求助:使用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>
代码说明
- 基础复制逻辑:默认模板复制所有未特殊处理的节点,确保
<summary>等原始内容完整保留 - worker拆分与排序:匹配原
<worker>节点后,遍历其下的<Effective_Change>并按<time>值升序排列 - 新worker生成:每个排序后的
<Effective_Change>对应生成一个新<worker>,复制原worker的<worker_summary> - 特殊节点处理:针对User 1的节点,移除
<Effective_Change>的sequence属性并截断<content>开头的用户名前缀;User 2的节点保留原有属性和文本
内容的提问来源于stack exchange,提问作者Mahesh
相关产品推荐
相关产品推荐

