如何用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
相关产品推荐
相关产品推荐

