XSLT中需在stylesheet根元素声明命名空间用于匹配输入和生成输出,前缀与URI必须一致且准确;避免拼接URI、复用前缀,可用exclude-result-prefixes抑制冗余输出,XSLT 2.0+支持xsl:namespace动态处理。

在XSLT中正确声明和使用命名空间,是处理带命名空间的XML输入或生成符合规范的XML输出的关键。核心原则是:**输入匹配要声明、输出生成要声明、前缀必须一致、URI必须准确**。
声明命名空间用于匹配输入XML
如果源XML文档中的元素属于某个命名空间(例如 ),XSLT无法用 match="urlset" 直接匹配——必须先在 根元素中声明该命名空间,并在XPath中使用对应前缀:
- 在样式表根节点添加命名空间声明,如:
xmlns:sitemap="http://www.sitemaps.org/schemas/sitemap/0.9" - 模板匹配改写为:
- 子元素访问也需加前缀:
声明命名空间用于生成目标XML
若要输出带命名空间的XML(如OAI-PMH、SOAP、Atom等标准格式),需在模板中直接写入命名空间声明属性,并确保前缀与样式表顶层声明一致:
启明星企业抽奖程序 系统采用ASP.NET4.0 无需数据库。在企业抽奖时,请勿关闭或者刷新页面。因为系统目前没有提供保存数据功能。例如在抽二等奖和一等奖之间,可能有时间间隔。那么,此时,你可以按F11取消全屏,然后最小化页面,再单击右下角喇叭,设置无声。1.启明星抽奖程序配置说明使用说明:在lottery/lottery文件夹下,有3个文本文件。company.txt存放公司名称,award.t
- 在
中声明所需前缀:xmlns:oai="http://www.openarchives.org/OAI/2.0/" - 在结果元素中显式写出命名空间属性:
- 也可省略前缀重复声明,仅靠顶层声明自动继承(XSLT处理器会自动补全):
→ 输出时自动带xmlns:oai="..."
避免常见错误的实用技巧
命名空间问题常导致匹配失败或输出无效,以下做法可大幅降低出错概率:
- 不要手动拼接命名空间URI字符串(如
xsl:element name="{$ns}:book"),易出错且不可读;优先用静态前缀+顶层声明 - 若输出中不需要显示某些前缀(如仅用于内部匹配的
msxsl),用exclude-result-prefixes="msxsl"抑制其出现在结果中 - 多命名空间场景下,每个URI都需独立声明前缀,不能复用同一前缀指向不同URI
- 验证是否生效:检查输出XML首行是否有
,关键元素是否带正确前缀,且浏览器或xmllint能通过语法校验
动态命名空间处理(XSLT 2.0+)
极少数场景需根据输入动态决定命名空间(如转发不同厂商的XML报文),可用 xsl:namespace 指令(XSLT 2.0起支持):
-
可在元素内动态添加命名空间声明 - 配合
name="{concat('ns:', $localname)}"实现动态元素名(但需谨慎,可读性差) - 日常开发中,静态声明+条件模板更清晰可靠









