xs:attribute 的 form 属性仅在局部声明时生效,控制属性是否带命名空间前缀;form="qualified"要求带前缀,form="unqualified"不带,省略则继承 attributeFormDefault(默认 unqualified);全局属性不受其影响,且 attributeFormDefault 与 elementFormDefault 相互独立。

xs:attribute 的 form 属性本身不强制限定命名空间,但它是否生效、如何生效,完全取决于它所在的上下文——尤其是父元素是否为全局声明(即在 xs:schema 直接子级)还是局部声明。
什么时候 form 有效?
只有当 xs:attribute 是局部声明(即嵌套在 xs:complexType 或 xs:element 内部)时,form 才起作用。此时它控制该属性是否应带命名空间前缀(即是否“限定”)。
常见错误现象:form="qualified" 写了但 XML 实例里仍没加前缀,其实是父 xs:element 自身没设 form="qualified",或整个 schema 缺少 elementFormDefault="qualified"。
-
form="qualified":该属性必须带目标命名空间前缀(如ns:attr="val") -
form="unqualified":该属性不带前缀(如attr="val"),即使它定义在有targetNamespace的 schema 中 - 若省略
form,则继承自attributeFormDefault(schema 级默认值),未声明时默认为unqualified
attributeFormDefault 和 elementFormDefault 的关系
这两个 schema 级配置项是独立开关,互不影响。一个管属性,一个管元素,别指望设了 elementFormDefault="qualified" 就自动让属性也限定。
使用场景:你希望所有局部属性都带命名空间前缀,又不想每个 xs:attribute 都写 form="qualified",那就直接在 xs:schema 上加 attributeFormDefault="qualified"。
-
attributeFormDefault="qualified"→ 所有局部xs:attribute默认带前缀(除非显式覆写为unqualified) -
attributeFormDefault对全局属性(即直接子于xs:schema的xs:attribute)无效 —— 全局属性永远是限定的 - 注意:XSD 1.0 不允许对全局属性设
form;XSD 1.1 虽允许语法上写,但语义上仍被忽略
为什么有时 form="qualified" 像没起作用?
根本原因常是 XML 实例文档没正确声明命名空间,或解析器/校验器没加载 targetNamespace 对应的 schema。
典型错误现象:xsi:noNamespaceSchemaLocation 指向了有 targetNamespace 的 XSD,但实例根元素没声明该命名空间,导致校验器按无命名空间模式处理,所有 qualified 设置都被绕过。
- 检查实例根元素是否包含
xmlns="http://example.com/ns"(匹配 schema 的targetNamespace) - 若用
xsi:schemaLocation,确保 namespace URI 和路径配对正确,例如:xsi:schemaLocation="http://example.com/ns schema.xsd" - 某些老工具(如部分 Java DOM 解析器)默认忽略命名空间,需显式开启
setNamespaceAware(true)
真正容易被忽略的是:局部属性的 form 行为,依赖整个验证上下文的一致性——命名空间声明、schema 加载方式、解析器配置,三者缺一不可。单独调对一个 form 值,解决不了问题。










