xs:simpletype不能包含子元素,仅能通过xs:restriction、xs:list或xs:union派生简单类型;带属性或混合内容必须用xs:complextype;正则需符合xsd规范,命名复用须注意targetnamespace一致性。

xs:simpleType 不能直接包含子元素
很多人写 XSD 时想在 xs:simpleType 里嵌套 xs:element 或 xs:complexType,结果校验直接报错:cos-element-consistent: Element 'xs:element' cannot appear here。这是因为 xs:simpleType 的语义就是「只描述值的类型」,不带结构、不带子节点——它天生就不能有子元素。
常见错误场景:想定义一个“带单位的数字”,比如 <price unit="USD">99.99</price>,然后试图用 xs:simpleType + 属性约束来搞定。不行,属性本身就需要复杂类型支撑。
- 如果要带属性(如
unit)、文本内容、或混合内容,必须用xs:complexType -
xs:simpleType只能通过xs:restriction或xs:list/xs:union来派生新类型,且基类型只能是内置简单类型(如xs:string、xs:decimal)或另一个xs:simpleType - 想限制字符串长度?用
xs:restriction base="xs:string"><maxlength value="50"></maxlength>,别往里面塞xs:element
自定义 simpleType 的三种合法扩展方式
真正能用在 xs:simpleType 内部的只有三类构造:限制(xs:restriction)、列表(xs:list)、联合(xs:union)。它们用途完全不同,混用会出问题。
比如想表示“逗号分隔的整数列表”,该用 xs:list;想表示“只能是 'active' 或 'inactive'”,该用 xs:restriction + xs:enumeration;而 xs:union 适合“可以是日期或字符串”这种松散类型。
-
xs:restriction:必须指定base,且所有子项(xs:minLength、xs:pattern等)都作用于该基类型值本身 -
xs:list:内部只能有一个xs:simpleType或内置类型,不能嵌套其他 list 或 union -
xs:union:成员类型必须全是简单类型,且不能递归引用自身(XSD 1.0 不支持)
pattern 里的正则语法受 XSD 规范严格约束
写 <pattern value="..."></pattern> 时,别直接搬 JavaScript 或 Java 的正则。XSD 使用的是 XML Schema RegEx,它基于 Unicode,但不支持 \d、\s、前瞻断言、捕获组这些常见特性。
2.0修改说明:1.重写产品,下载模块,无限级分类2.将产品,下载,图片,新闻进行伪静态处理。3.取掉了原有的风格模块,下次更新加模板系统和自定义标签。4.增加缓存机制,减少对数据库的调用,缓存默认30分钟。
例如,想匹配“4位数字”,不能写 \d{4},得写 [0-9]{4};想匹配“非空字符串”,不能用 ^.*$(XSD 正则默认全匹配,开头结尾锚点无效),直接用 .+ 就行。
- 字符类优先用
[a-z]而不是\p{Ll}(后者虽在 XSD 1.1 支持,但多数老解析器只认 1.0) - 量词只支持
{n}、{n,}、{n,m}和?、*、+,不支持*?这类懒惰匹配 - 避免用
.匹配换行符——XSD 默认不把\n当普通字符,除非显式在 pattern 中写[\s\S]
命名 simpleType 后复用,但别跨 targetNamespace 混用
给 xs:simpleType 加 name 属性后,它就成了全局类型,可以在任何地方用 type="tns:MyType" 引用。但很多人忽略命名空间绑定是否一致。
典型错误:主 XSD 声明了 targetNamespace="http://example.com/ns",但引用时没声明前缀或前缀没绑定到对应 URI,导致解析器找不到类型,报错:src-resolve: Cannot resolve the name 'MyType' to a(n) 'type definition' component。
- 确保引用处的前缀(如
tns)通过xmlns:tns="http://example.com/ns"正确绑定 - 如果 XSD 没设
targetNamespace,所有类型默认在无命名空间下,引用时不能加前缀(即直接写type="MyType") - 不同
targetNamespace的 simpleType 不能直接互相 restriction(除非用xs:import导入并正确引用)
最常被忽略的一点:XSD 解析器对命名空间大小写敏感,http://example.com/NS 和 http://example.com/ns 是两个完全不同的空间,类型不会互通。









