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

如何用XSLT合并XML元素的attrib属性值与元素内容?

如何将XML元素的attrib属性值与元素内容合并?

输入XML

<Files>
<File>
    <Data1>
        <item attrib="Old">value1</item>
    </Data1>
    <Data2 attrib="Old"/>
    <Data3>
        <item attrib="New">value2</item>
    </Data3>
</File>
<File attrib="New">
    <Data1>
        <item2>
           <item3 attrib="Old">value3</item3>       
        </item2>
    </Data1>
</File>
<File attrib="New">
    <Data1>
        <item attrib="Old">value1</item>
    </Data1>
</File>
</Files>

需求说明

匹配所有attrib属性值为"Old"且包含非空文本内容的元素,将属性值与元素内容以“-”连接(例如Old-value1);空元素或attrib属性值不为"Old"的元素保持原样。

期望输出XML

<Files>
<File>
    <Data1>
        <item attrib="Old">Old-value1</item>
    </Data1>
    <Data2 attrib="Old"/>
    <Data3>
        <item attrib="New">value2</item>
    </Data3>
</File>
<File attrib="New">
    <Data1>
        <item2>
           <item3 attrib="Old">Old-value3</item3>       
        </item2>
    </Data1>
</File>
<File attrib="New">
    <Data1>
        <item attrib="Old">Old-value1</item>
    </Data1>
</File>
</Files>

当前XSLT模板问题

当前使用的模板仅将元素内容替换为属性值,未实现合并:

<xsl:template match="*[@attrib='Old' and normalize-space(.)]">
    <xsl:copy>
        <xsl:apply-templates select="@*" />
        <xsl:value-of select="@attrib" separator="-"/>
    </xsl:copy>
</xsl:template>

生成的输出中,目标元素内容仅保留了Old,丢失了原文本内容。

修正后的XSLT代码

要实现合并功能,需要调整内容生成逻辑,同时保留身份转换模板以维持原XML结构:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- 身份转换模板:保留所有未被匹配的节点 -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <!-- 匹配attrib="Old"且非空的元素,合并属性值与内容 -->
    <xsl:template match="*[@attrib='Old' and normalize-space(.)]">
        <xsl:copy>
            <xsl:apply-templates select="@*" />
            <!-- 拼接属性值和元素文本内容,用“-”分隔 -->
            <xsl:value-of select="concat(@attrib, '-', normalize-space(.))"/>
            <!-- 若使用XSLT 2.0及以上,也可以用更简洁的写法:
            <xsl:value-of select="@attrib, normalize-space(.)" separator="-"/>
            -->
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

修正说明

  1. 添加身份转换模板:确保所有未被自定义模板匹配的节点(包括其他元素、属性、空元素、文本)都能原样保留,避免原XML结构被破坏。
  2. 调整内容拼接逻辑:使用concat()函数将@attrib的值、分隔符“-”和元素的标准化文本内容合并;如果使用XSLT 2.0及以上版本,也可以用xsl:value-of同时选择两个值并指定分隔符,写法更简洁。
  3. 保留空元素处理:空元素因normalize-space(.)结果为空,不会被自定义模板匹配,因此保持原空元素<Data2 attrib="Old"/>的状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 08:36:18