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

Linux下通过xsltproc插入XML节点失败的问题求助

XML节点添加失败的解决方法

问题根源

  • 命名空间未处理:原始XML的<root>节点带有xmlns="http://www.tibco.com/xmlns/"命名空间,XSLT中未声明并关联该命名空间,导致元素匹配规则完全失效。
  • 匹配逻辑错误:原XSLT用@name='Balloon'匹配属性,但name是element2的子元素而非属性,应该通过子元素值筛选目标节点。
  • 节点位置错误:原脚本将新节点放在<xsl:copy>外部,导致新节点被添加到element2同级,而非目标节点内部。

修正后的XSLT脚本

cat <<EOT > insert.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:tib="http://www.tibco.com/xmlns/"
                exclude-result-prefixes="tib">
<xsl:output method="xml" indent="yes"/>

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

<xsl:template match="tib:root/tib:element2[tib:name='Balloon']">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
        <tib:element2_2>
            <tib:name>Edward</tib:name>
        </tib:element2_2>
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>
EOT

关键修正点

  1. 声明tib前缀绑定原XML的命名空间,exclude-result-prefixes确保输出XML不保留多余前缀(若需保留可删除该属性)。
  2. 匹配表达式改为tib:root/tib:element2[tib:name='Balloon'],正确匹配带命名空间的元素,并通过子元素name的值定位目标节点。
  3. 将element2_2节点移至<xsl:copy>内部、apply-templates之后,确保新节点成为目标element2的子节点。

验证结果

执行原命令:

xsltproc insert.xsl original.xml > ./updated.xml

生成的updated.xml会符合预期结构,element2_2节点被正确添加到name为Balloon的element2节点内部。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 06:45:16