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

使用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>

关键说明

  1. 解析XML字符串:使用msxsl:parse将XML字符串(从result/XML/text()取出CDATA的纯文本)解析为DOM节点。
  2. 结果树片段转节点集:$parsedXML是结果树片段,需用msxsl:node-set转换为可查询的节点集$parsedNodeSet。
  3. 命名空间处理:声明目标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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 09:42:41