升级XSL样式表命名空间后清理ADO XML输出异常如何修复
你当前遇到的问题主要由3个错误导致:
- 新样式表将XSLT命名空间设为了默认命名空间,导致你创建的
<data>、<row>等输出元素都继承了XSLT的命名空间,所以会多出xmlns="http://www.w3.org/1999/XSL/Transform"属性 - 缺少
s前缀对应的命名空间声明,导致匹配s:Schema的规则没有生效 - 根模板匹配的是
/文档根节点而非<xml>根元素,导致根标签的处理不符合预期
以下是修正后可直接使用的完整样式表,兼容MSXML2.DOMDocument60运行环境:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema" exclude-result-prefixes="s rs z xsl"> <!-- 输出配置:匹配预期格式,去掉XML声明、启用缩进 --> <xsl:output method="xml" omit-xml-declaration="yes" indent="yes" encoding="UTF-8"/> <!-- 匹配根xml元素,保留标签结构,过滤所有命名空间属性 --> <xsl:template match="/*"> <xml> <xsl:apply-templates select="node()"/> </xml> </xsl:template> <!-- 通用节点复制规则 --> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> <!-- 移除rs:insert标签,仅透传子内容 --> <xsl:template match="rs:insert"> <xsl:apply-templates select="node()"/> </xsl:template> <!-- rs:data转换为无属性的纯data标签 --> <xsl:template match="rs:data"> <data> <xsl:apply-templates select="node()"/> </data> </xsl:template> <!-- z:row转换为纯row标签,保留所有属性 --> <xsl:template match="z:row"> <row> <xsl:copy-of select="@*"/> </row> </xsl:template> <!-- 移除整个Schema节点 --> <xsl:template match="s:Schema"/> <!-- 兼容rs:forcenull属性转换逻辑 --> <xsl:template match="@rs:forcenull"> <xsl:attribute name="forcenull"> <xsl:value-of select="."/> </xsl:attribute> </xsl:template> </xsl:stylesheet>
上述样式表完全满足你列出的4项需求,输入数据结构不变的情况下可通用适配动态内容。
内容的提问来源于stack exchange,提问作者cibuan
相关产品推荐
相关产品推荐

