命名空间声明
xmlns:前缀="URI"挂在某个元素的开始标签上,效力覆盖该元素及其全部后代;xmlns="URI"形式的默认声明让不带前缀的元素也归属该 URI;子元素上重新声明可以覆盖父级。本节合并讲解语法与作用域(原教程两节内容在此整合),用覆盖实验与属性冷知识把规则钉牢。
<catalog xmlns:wh="http://wh.example.org/v1"> <!-- 前缀式:wh 绑定生效,管 catalog 及其后代 --> <wh:title>显示器支架</wh:title> </catalog> <catalog xmlns="http://wh.example.org/v1"> <!-- 默认式:无前缀的元素自动归属该 URI --> <title>显示器支架</title> </catalog>
两份文档语义完全相同。默认式的取舍:少打前缀、文档干净,但词汇表一旦超过一套就露怯——第二套还是得用前缀,混用时读者容易误以为无前缀元素"没有命名空间"。工程惯例:主词汇表用默认声明,外来词汇用前缀,这正是一份 XSLT 样式表的典型长相(5.2 节会见到实例)。
属性是特例:默认命名空间不管属性。<title lang="zh"> 里的 lang 永远是无命名空间的裸属性;属性要进命名空间必须显式写前缀 <title wh:lang="zh">。原因:属性本来就依附于所属元素,元素已经定位了词汇表,属性极少再有二义。
规则一句话:声明在哪个元素上,就管到哪个元素的整棵子树;子树内重新声明,就近覆盖。做两个实验。
实验一,就近覆盖:
<r xmlns="http://a.example.org"> <c xmlns="http://b.example.org"> <!-- c 子树内默认命名空间被覆盖为 b --> <leaf/> <!-- 属于 b --> </c> <sib/> <!-- 回到 a 的作用域,属于 a --> </r>
实验二,前缀重绑:
<r xmlns:wh="http://a.example.org"> <c xmlns:wh="http://b.example.org"> <wh:leaf/> <!-- 同名前缀被就近重绑,此处的 wh:leaf 属于 b --> </c> <wh:leaf/> <!-- 属于 a --> </r> <!-- 合法但强烈不推荐:同一文档同一前缀两义,读者必错 -->
实验结论写成检查单:读文档遇到限定名,从该元素向上找最近的同名声明,找到即归属;同一前缀多处声明时尤其要逐层核对。反过来写文档时:前缀声明统一放在根元素,一文档一前缀一义,覆盖语法虽然合法,可读性代价太高。这套"就近覆盖"规则与编程语言的变量作用域同构——内层声明遮蔽外层同名声明,出作用域即失效——有编程基础的读者可以借这个同构快速建立手感,但注意 XML 的作用域是树的子树而非代码块,兄弟分支之间互不可见、互不影响。
回收 3.4 节的伏笔:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
现在可以完整解读:xs 是本文档内为 Schema 词汇表起的别名,绑定到 W3C 的 2001 版 URI;xs:element、xs:complexType 都是这块车牌下的元素。为什么 XSD 自身要用命名空间?因为契约文档要跟被约束的业务文档、跟 Schema 实例词汇表三方共存,裸名立刻撞车。第 5 章的 XSLT 样式表同理:xsl: 前缀是转换指令词汇表,样式表里还混杂着要输出的 HTML 词汇,两套并存全靠贴标。
⚠️ 高频坑两枚:其一,属性值里的 URI 拼错一个字母,程序把它当成新词汇表,校验静默失败——查错时先把所有 xmlns 声明的 URI 逐字符比对;其二,给根元素写了默认命名空间,又在子元素上写
xmlns=""想退回裸名——合法但语义是"退入无命名空间",下游契约很可能没为它准备条款。

词汇表升级时,URI 里的版本号路径开始发挥威力。发布方把新词汇表挂到新版本 URI 下,两代词汇表在传输层就是两个不同的命名空间——同一个文档里甚至可以同时出现一代与二代的元素,各自归属清晰、互不覆盖。消费方按自身支持版本选择性处理,升级节奏各自掌控。这套"版本进 URI"的做法是 XML 生态的标准版本化方案,XSD、XSLT 的历代规范都这么发布。
与之对照的反模式是"原地变更":URI 不变、词汇表悄悄改语义。这等于给所有人换了车牌却不通知,消费方按旧语义解析新数据,错得悄无声息。所以团队规范里应写死一条:词汇表的任何不兼容变更,必须换 URI;兼容性变更(新增可选元素)可以原地迭代,但要在变更日志里登记。命名空间的"身份"设计,把版本管理这个工程难题转化成了贴标签问题——这正是它被广泛采用的深层原因。
顺带说明前缀选择的社区默契,它是可读性的隐形契约。xs 留给 XML Schema,xsl 留给转换样式表,svg 留给矢量图形,soap 留给信封——这些默认搭配就像螺丝的正反扣,乱配能拧但费劲。自造前缀时建议取词汇表名的短缩写并在文档注释里声明指代,别用单字母以防撞车。前缀虽是"口味问题",但全生态的口味聚合起来就是事实标准,个人口味让位于惯例,省下的是每个读者的半分钟困惑。
贴好标的文档结构已就绪,进入第 5 章加工流水线:解析器如何把这棵带标牌的树搬进内存、XSLT 如何整树变形、XPath 如何按图索骥。