XML命名空间导致取值失败,请求协助编写目标输出的XSLT
搞定混合命名空间的XML提取问题
嘿,我太懂这种被XML命名空间搞懵的感觉了!一会儿带前缀(soap、ns3)一会儿是默认命名空间,XPath根本找不到元素对吧?别慌,我给你写一套针对性的XSLT,保证能顺利提取到你要的值。
核心思路:先声明所有命名空间,再用前缀精准定位
XML里的命名空间不管是带前缀还是默认的,在XSLT里都得先明确声明,而且默认命名空间必须给它分配一个自定义前缀(因为XPath不认无前缀的默认命名空间),这样才能准确访问到每个元素。
完整XSLT示例
假设你的目标是提取默认命名空间下的元素值(比如OrderID、Status这类),下面是适配你输入结构的XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns3="http://www.test.com/ns/wsdl/test-V2_4" xmlns:t21="http://www.test.com/ns/xsd/test-V2_1" <!-- 给默认命名空间加前缀t21 --> exclude-result-prefixes="soap ns3 t21"> <!-- 输出时去掉这些前缀 --> <!-- 匹配整个SOAP信封的入口 --> <xsl:template match="/"> <xsl:apply-templates select="soap:Envelope/soap:Body/ns3:NotificationResponse"/> </xsl:template> <!-- 处理NotificationResponse下的内容 --> <xsl:template match="ns3:NotificationResponse"> <ExtractedData> <!-- 提取默认命名空间下的元素,用我们声明的t21前缀 --> <OrderID> <xsl:value-of select="t21:OrderID"/> </OrderID> <Status> <xsl:value-of select="t21:Status"/> </Status> <!-- 如果你还要提取其他元素,照着这个格式加就行 --> </ExtractedData> </xsl:template> </xsl:stylesheet>
关键要点说明
- 命名空间声明:在
<xsl:stylesheet>里必须把输入XML里的所有命名空间都写上,包括soap、ns3,还有给默认命名空间(http://www.test.com/ns/xsd/test-V2_1)分配了t21前缀——这是解决问题的核心,因为XPath里不能直接访问无前缀的默认命名空间元素。 - XPath定位:所有元素都要带上对应的前缀,比如
soap:Envelope、ns3:NotificationResponse、t21:OrderID,这样XSLT才能准确找到目标元素。 - 输出控制:
exclude-result-prefixes属性可以让输出的XML里不包含这些命名空间前缀,让结果更干净。
假设的目标输出示例
如果你的输入里有t21:OrderID="ORD123"和t21:Status="SUCCESS",上面的XSLT会输出:
<ExtractedData> <OrderID>ORD123</OrderID> <Status>SUCCESS</Status> </ExtractedData>
要是你有具体要提取的其他元素,只要照着模板里的格式,用对应的前缀定位就行,绝对能搞定混合命名空间的问题!
内容的提问来源于stack exchange,提问作者Amit Sahoo
相关产品推荐
相关产品推荐

