xs:any通过namespace属性声明允许的命名空间,取值包括##any、##other、##local或具体URI列表,并配合processContents(lax/skip/strict)控制校验严格度,校验只认URI不认前缀。
xs:any 本身不直接“限制”命名空间,而是通过 namespace 属性来**声明允许哪些命名空间中的元素可以出现在该位置**。关键在于正确设置 namespace 的值,并配合 processContents 控制校验行为。
用 namespace 属性指定允许的命名空间
在 中,namespace 是核心属性,取值有以下几种:
- `##any`(默认):允许来自任何命名空间(包括无命名空间)的元素
- `##other`:允许来自除当前 schema 目标命名空间外的任意命名空间的元素
- `##local`:只允许无命名空间(即未带前缀、且未声明默认命名空间)的元素
-
一个或多个具体命名空间 URI,用空格分隔:例如
namespace="http://example.com/ns1 http://example.com/ns2",表示只接受这两个命名空间下的元素
配合 processContents 控制校验严格度
processContents 决定解析器是否尝试校验 xs:any 位置上的元素内容:
- `lax`(推荐常用):如果能找到对应元素声明,则校验;找不到也不报错,跳过校验
- `skip`:完全不校验,仅做语法解析(XML Well-Formed 检查)
- `strict`:必须能找到对应全局元素声明,否则报错(要求高,需提前定义所有可能元素)
实际中多用 processContents="lax",兼顾灵活性与基本校验。