通过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
相关产品推荐
相关产品推荐

