如何通过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>
关键修改点
- 补充缺失的命名空间:添加了
s(SOAP信封标准命名空间)和xsi的命名空间声明,确保XPath能正确识别XML中的前缀节点。 - 精准过滤节点:在XPath中增加
and element_II:name='GGUID'条件,只选中name属性为GGUID的那个fields节点的value。 - 简化逻辑:移除了冗余的
<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
相关产品推荐
相关产品推荐

