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

如何通过XSLT从指定XML文件中提取正确的GGUID

如何精准提取XML中指定的GGUID值(XSLT修复方案)

你的问题核心在于XSLT的节点选择逻辑不够精准——你只检查了是否存在name为GGUID的节点,但提取值时还是选中了所有类型为GGUIDField的节点值,所以才会把OWNERGUID的空值也一并输出。下面是具体的修复方案:

原问题回顾

你需要从这段静态XML中提取name为GGUID的对应值:

<?xml version="1.0"?>
<s:Envelope>
<s:Body>
<element:saveAndReturnObjectResponse xmlns:element="http://some-link">
<element:return>
<element_II:fields xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:element_II="http://some-link" xsi:type="element_II:GGUIDField">
<element_II:name>GGUID</element_II:name>
<element_II:fieldType>GGUID</element_II:fieldType>
<element_II:value>D6443FCE29334414AF2DC5A30C90506C</element_II:value>
</element_II:fields>
<element_II:fields xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:element_II="http://some-link" xsi:type="element_II:GGUIDField">
<element_II:name>OWNERGUID</element_II:name>
<element_II:fieldType>GGUID</element_II:fieldType>
<element_II:value>00000000000000000000000000000000</element_II:value>
</element_II:fields>
</element:return>
</element:saveAndReturnObjectResponse>
</s:Body>
</s:Envelope>

原XSLT的问题有两个:一是<xsl:if>仅做存在性检查,但<xsl:value-of>的路径没有过滤name条件;二是缺少s前缀和xsi前缀的命名空间声明,这可能在某些环境下引发隐性匹配问题。

修复后的XSLT代码

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
                xmlns:element="http://some-link"
                xmlns:element_II="http://some-link"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                version="2.0">
    <xsl:output media-type="text/xml" method="xml" indent="yes"/>
    
    <xsl:template match="/">
        <root>
            <!-- 精准定位到name为GGUID的GGUIDField节点 -->
            <element_II:value>
                <xsl:value-of select="concat('0x', /s:Envelope/s:Body/element:saveAndReturnObjectResponse/element:return/element_II:fields[@xsi:type='element_II:GGUIDField' and element_II:name='GGUID']/element_II:value)"/>
            </element_II:value>
        </root>
    </xsl:template>
</xsl:stylesheet>

关键修改点

  1. 补充缺失的命名空间:添加了s(SOAP信封标准命名空间)和xsi的命名空间声明,确保XPath能正确识别XML中的前缀节点。
  2. 精准过滤节点:在XPath中增加and element_II:name='GGUID'条件,只选中name属性为GGUID的那个fields节点的value。
  3. 简化逻辑:移除了冗余的<xsl:if>判断——如果没有匹配的节点,concat只会返回0x,若需要处理空值场景,可再添加存在性判断。

输出结果

运行修复后的XSLT,会得到你期望的结果:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <element_II:value xmlns:element_II="http://some-link">0xD6443FCE29334414AF2DC5A30C90506C</element_II:value>
</root>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 17:27:42