使用msxsl:node-set解析XML字符串提取节点值遇空值问题求助
XSLT解析CDATA中XML字符串并提取节点的解决方案
问题根源
msxsl:node-set无法直接解析XML字符串(包括CDATA包裹的内容),它仅用于将结果树片段转换为可查询的节点集。- 原代码中传递给
parseXML模板的result/XML是包含CDATA的元素节点,不是已解析的XML结构,导致后续操作返回空值。 - 目标XML带有命名空间,直接用无前缀的节点路径无法匹配到元素。
修正后的XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:iso="urn:iso:std:iso:20022:tech:xsd:taco.097.001.90"> <xsl:template name="parseXML"> <xsl:param name="xmlString"/> <!-- 使用msxsl:parse解析XML字符串为节点集 --> <msxsl:parse var="doc" select="$xmlString"/> <xsl:copy-of select="$doc/*"/> </xsl:template> <xsl:template match="/"> <xsl:variable name="parsedXML"> <xsl:call-template name="parseXML"> <!-- 取出CDATA中的纯文本字符串 --> <xsl:with-param name="xmlString" select="result/XML/text()"/> </xsl:call-template> </xsl:variable> <!-- 将结果树片段转为节点集 --> <xsl:variable name="parsedNodeSet" select="msxsl:node-set($parsedXML)"/> <!-- 提取MsgId,注意使用命名空间前缀 --> <element1> <xsl:value-of select="$parsedNodeSet/iso:Document/iso:GrpHdr/iso:MsgId"/> </element1> </xsl:template> </xsl:stylesheet>
关键说明
- 解析XML字符串:使用
msxsl:parse将XML字符串(从result/XML/text()取出CDATA的纯文本)解析为DOM节点。 - 结果树片段转节点集:
$parsedXML是结果树片段,需用msxsl:node-set转换为可查询的节点集$parsedNodeSet。 - 命名空间处理:声明目标XML的命名空间前缀
iso,查询节点时必须带上前缀,否则无法匹配到带命名空间的Document、GrpHdr等元素。
关于直接提取MsgId的问题
你提到的<element1><xsl:value-of select="$parsedXML/Document/GrpHdr/MsgId"/></element1>无法直接生效,原因有两个:
$parsedXML是结果树片段,不能直接用路径查询,必须先转成节点集。- 目标元素带有命名空间,必须使用对应的前缀才能匹配。
修正后使用$parsedNodeSet/iso:Document/iso:GrpHdr/iso:MsgId即可正确提取MsgId的值。
内容的提问来源于stack exchange,提问作者Nimrod
相关产品推荐
相关产品推荐

