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

XSLT实现指定XML转换出错,如何正确创建新元素?

XSLT XML转换问题解决

问题说明

需要将以下输入XML:

<?xml version="1.0" encoding="utf-8"?>
<items>
    <element name="Name1" value="Text1"/>
    <element name="Name2" value="Text2"/>
    <element name="Name3" value="Text3"/>

</items>

转换为目标XML(注:原目标XML中存在结束标签笔误,以下为修正后的正确目标结构):

<?xml version="1.0"?>
<goods>
    <!-- some text -->
    <Name1>Text1</Name1>
    <Name2>Text2</Name2>
    <Name3>Text3</Name3>    
</goods>

用户编写的XSLT无法正常工作,代码如下:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" />
    <xsl:template match="/">
        <xsl:element name="goods">
            <xsl:comment>
                some text               
            </xsl:comment>      
        </xsl:element>
    </xsl:template>

    <xsl:template match="/items/element">
            <xsl:element name="{@name}">
                    <xsl:value-of select="@value"/>     
            </xsl:element>                  
    </xsl:template>

</xsl:stylesheet>

问题根源

你的XSLT中,匹配根节点/的模板仅输出了<goods>元素和注释,但没有触发处理items/element节点的逻辑——XSLT默认只会应用最匹配的模板,且根模板内没有调用其他模板或遍历子节点,导致element对应的模板完全没被执行。

解决方案

方案1:嵌套调用模板

修改根模板,在<goods>内部添加<xsl:apply-templates>来触发element节点的模板:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="no"/>
    <xsl:template match="/">
        <goods>
            <xsl:comment>some text</xsl:comment>
            <!-- 调用处理element节点的模板 -->
            <xsl:apply-templates select="items/element"/>
        </goods>
    </xsl:template>

    <xsl:template match="items/element">
        <xsl:element name="{@name}">
            <xsl:value-of select="@value"/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

方案2:直接遍历节点(无需单独模板)

在根模板中直接循环处理items/element节点,省去单独的模板定义:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="no"/>
    <xsl:template match="/">
        <goods>
            <xsl:comment>some text</xsl:comment>
            <!-- 直接遍历生成目标元素 -->
            <xsl:for-each select="items/element">
                <xsl:element name="{@name}">
                    <xsl:value-of select="@value"/>
                </xsl:element>
            </xsl:for-each>
        </goods>
    </xsl:template>
</xsl:stylesheet>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 10:10:28