使用XSLT转换XML时节点值为空,请求技术排查
问题排查及解决方案
嘿,我帮你找出了两个核心问题,这就是为什么转换后节点值为空的原因:
1. 命名空间绑定完全不匹配
你源XML里的ns2前缀对应的命名空间是http://www.host.com/ERP/Sales/ProcessPartsOrder,但你的XSLT里却把ns2绑定到了http://www.host.com/ERP/Sales/CustomerOrderManagement——这俩完全不是一回事,XSLT根本找不到对应的节点,自然拿不到值。
另外,源XML里的CultureCode、SenderNameCode这些元素属于默认命名空间http://www.host.com/ERP/Sales/Entities,你之前的XSLT没绑定这个命名空间,就算路径对了也访问不到这些元素。
2. XPath路径上下文错误
你的模板匹配的是根节点/*(也就是ns2:ProcessPartsOrder),但在xsl:value-of里要么写了绝对路径/ns2:ProcessPartsOrder/...(相当于从根节点再找一次根节点,肯定找不到),要么相对路径没考虑当前节点的上下文,导致定位失败。
修正后的完整XSLT代码
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns2="http://www.host.com/ERP/Sales/ProcessPartsOrder" <!-- 修正ns2的命名空间,和源XML一致 --> xmlns:ent="http://www.host.com/ERP/Sales/Entities" <!-- 绑定源XML的默认命名空间 --> xmlns:proc="http://www.host.com/ERP/Sales/ProcessPartsOrder" xmlns:par="http://www.host.com/ERP/Sales/Aggregates/PartsOrder" xmlns:val="http://www.host.com/ERP/Sales/ValueObjects" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="ns2 ent xs"> <xsl:output method="xml" encoding="UTF-8" indent="yes"/> <!-- 明确匹配根节点,逻辑更清晰 --> <xsl:template match="ns2:ProcessPartsOrder"> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:proc="http://www.host.com/ERP/Sales/ProcessPartsOrder" xmlns:ent="http://www.host.com/ERP/Sales/Entities" xmlns:par="http://www.host.com/ERP/Sales/Aggregates/PartsOrder" xmlns:val="http://www.host.com/ERP/Sales/ValueObjects"> <soapenv:Header/> <soapenv:Body> <proc:ProcessPartsOrder> <proc:MessageHeader> <ent:CultureCode> <!-- 使用相对路径,通过ent前缀访问默认命名空间下的元素 --> <xsl:value-of select="ns2:MessageHeader/ent:CultureCode"/> </ent:CultureCode> <ent:SenderNameCode> <xsl:value-of select="ns2:MessageHeader/ent:SenderNameCode"/> </ent:SenderNameCode> <ent:CreationDateTime> <xsl:value-of select="ns2:MessageHeader/ent:CreationDateTime"/> </ent:CreationDateTime> <ent:BODID> <xsl:value-of select="ns2:MessageHeader/ent:BODID"/> </ent:BODID> </proc:MessageHeader> </proc:ProcessPartsOrder> </soapenv:Body> </soapenv:Envelope> </xsl:template> </xsl:stylesheet>
重点修正说明
- 命名空间修复:把
ns2的命名空间改成和源XML一致的,同时给源XML的默认命名空间绑定ent前缀——因为XML里没有前缀的元素默认属于这个命名空间,必须用前缀才能在XPath里访问。 - 路径修复:模板已经匹配了根节点,所以内部用相对路径
ns2:MessageHeader/ent:CultureCode就能直接定位到目标元素,不用再写绝对路径。 - 模板匹配优化:把模糊的
match="/*"改成明确的match="ns2:ProcessPartsOrder",避免匹配到其他无关的根节点,逻辑更严谨。
用这个修正后的XSLT转换,就能得到你想要的带正确节点值的XML结果了。
内容的提问来源于stack exchange,提问作者Hitesh Gupta
相关产品推荐
相关产品推荐

