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

如何用MSXML6.0提取XML中AppHdr与Document元素的命名空间

解决MSXML6.0提取AppHdr和Document命名空间的问题

问题根源

MSXML6.0仅支持XPath 1.0和XSLT 1.0,你的原样式表设置了version="2.0",且使用了XPath 2.0的语法,这直接导致msxsl.exe报错。另外,XPath 1.0对命名空间轴的使用规则和2.0也有差异,需要调整写法。

解决方案1:提取元素的默认命名空间URI(最直接)

如果只需要获取AppHdr和Document的默认xmlns值,用XPath 1.0的namespace-uri()函数就能直接实现,不需要操作命名空间轴。

修改后的XSL样式表:

<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- 匹配Messages下的AppHdr元素 -->
  <xsl:template match="Messages/*[local-name()='AppHdr']">
    <AppHdrNamespace>
      <xsl:value-of select="namespace-uri()"/>
    </AppHdrNamespace>
  </xsl:template>

  <!-- 匹配Messages下的Document元素 -->
  <xsl:template match="Messages/*[local-name()='Document']">
    <DocumentNamespace>
      <xsl:value-of select="namespace-uri()"/>
    </DocumentNamespace>
  </xsl:template>

  <!-- 忽略其他节点,避免输出原XML内容 -->
  <xsl:template match="text()|@*"/>
</xsl:stylesheet>

解决方案2:提取元素上的所有命名空间节点(包括带前缀的)

如果需要获取元素上声明的所有命名空间(比如Document里的xmlns:xsi),可以在XPath 1.0中使用namespace::*轴,但需要注意:必须先匹配到目标元素节点,再选择其命名空间轴,且要避免匹配到继承的命名空间(可选)。

修改后的XSL样式表:

<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- 处理AppHdr的所有命名空间 -->
  <xsl:template match="Messages/*[local-name()='AppHdr']">
    <AppHdrNamespaces>
      <xsl:apply-templates select="namespace::*"/>
    </AppHdrNamespaces>
  </xsl:template>

  <!-- 处理Document的所有命名空间 -->
  <xsl:template match="Messages/*[local-name()='Document']">
    <DocumentNamespaces>
      <xsl:apply-templates select="namespace::*"/>
    </DocumentNamespaces>
  </xsl:template>

  <!-- 输出单个命名空间的前缀和URI -->
  <xsl:template match="namespace::*">
    <Namespace>
      <Prefix><xsl:value-of select="name()"/></Prefix>
      <URI><xsl:value-of select="."/></URI>
    </Namespace>
  </xsl:template>

  <!-- 忽略其他节点 -->
  <xsl:template match="text()|@*"/>
</xsl:stylesheet>

关键说明

  • 必须将xsl:stylesheet的version设为1.0,这是MSXML6.0唯一支持的XSLT版本。
  • 使用*[local-name()='AppHdr']而不是*:AppHdr:因为MSXML6.0对未声明前缀的通配符支持有限,通过本地名称匹配能更稳妥地定位到目标元素,无需预先知道命名空间URI。
  • namespace-uri()函数是XPath 1.0的标准函数,能直接返回元素所属的默认命名空间URI,是提取默认xmlns的最优方式。

内容的提问来源于stack exchange,提问作者Karas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 19:18:12