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

通过XSLT转换XML:区分同节点下不同值并动态生成节点名

通过XSLT转换XML:区分同节点下不同值并动态生成节点名

嘿,我来帮你搞定这个XSLT转换的问题!你遇到的命名空间和动态生成节点的困惑其实挺普遍的,咱们一步步拆解解决。

首先,核心问题有两个:一是处理XML里的命名空间,二是把ens:param里的name值作为新节点的名称,value值作为节点内容,同时自动处理多个param条目。

完整的XSLT转换代码

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:ens="urn:example.com">

    <!-- 匹配根节点,开始转换 -->
    <xsl:template match="/soapenv:Envelope">
        <queryParameters>
            <!-- 遍历所有ens:param节点 -->
            <xsl:for-each select="soapenv:Body/ens:query/ens:param">
                <!-- 动态生成节点:用ens:name的文本作为节点名,ens:value的文本作为节点内容 -->
                <xsl:element name="{ens:name}">
                    <xsl:value-of select="ens:value"/>
                </xsl:element>
            </xsl:for-each>
        </queryParameters>
    </xsl:template>

</xsl:stylesheet>

关键细节解释

  • 命名空间处理:你必须在XSLT里声明原XML用到的所有命名空间(soapenv和ens),这样XSLT才能正确识别并选中对应的节点。如果漏掉命名空间,XSLT会找不到ens:param这些节点,自然没法处理。
  • 动态生成节点:<xsl:element name="{ens:name}">这里的大括号是XSLT的「属性值模板」,它会把ens:name节点里的文本内容(比如maxRows)直接作为新节点的名称,完美实现你需要的“从节点值创建节点名”的需求。
  • 处理多个param条目:用<xsl:for-each>遍历所有ens:param节点,不管有多少个参数,都会自动逐个处理,不用手动指定第1个、第2个,这样代码更灵活通用。

转换后的结果

用上面的XSLT处理你提供的XML,就能得到你想要的输出:

<queryParameters>
    <maxRows>123</maxRows>
    <startingRow>456</startingRow>
</queryParameters>

小提醒:如果你的ens:name值里包含空格、特殊字符这类不符合XML节点命名规则的内容,可能需要额外做清洗处理,但你的例子里的名称都是合法的,所以直接用就没问题啦。

备注:内容来源于stack exchange,提问作者JuniorDev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 15:27:31