xs:element ref是否可以直接引用父元素下的非顶层子元素?
结论
你尝试的写法不可行,XSD不支持直接引用嵌套在其他元素内部的局部子元素。
核心规则说明
XSD规范中,ref属性仅支持引用全局顶层元素——也就是直接定义在<xs:schema>根节点下的元素,这类元素具备全局唯一的限定名(QName),可以跨命名空间引用。
而你定义的Child1是嵌套在Parent复杂类型内部的局部元素,作用域仅属于Parent的类型定义,没有全局唯一标识,不管用.、:还是其他分隔符都没有对应的规范支持,自然无法被ref直接引用。
替代方案
如果你不想将Child1提升为顶层全局元素,可以采用以下方式实现复用需求:
- 若仅需要复用
Child1的类型定义,可以将类型抽为全局公共类型:
<!-- 在parents命名空间下定义全局类型 --> <xs:simpleType name="Child1Type"> <xs:restriction base="xs:string" /> </xs:simpleType> <!-- Parent中引用该类型 --> <xs:element name="Parent"> <xs:complexType> <xs:all> <xs:element name="Child1" type="parents:Child1Type" /> <xs:element name="Child2" type="xs:int" /> </xs:all> </xs:complexType> </xs:element> <!-- 其他位置需要同类型元素时直接复用类型即可 --> <xs:element name="OtherElement" type="parents:Child1Type" />
- 如果你需要完全复用
Child1的元素声明(包含名称、类型、约束等所有属性),只能将Child1提升为顶层全局元素,这是XSD中复用元素本身的唯一合法方式:
<!-- 提升为顶层全局元素 --> <xs:element name="Child1" type="xs:string" /> <xs:element name="Parent"> <xs:complexType> <xs:all> <!-- 父元素中也引用该全局元素 --> <xs:element ref="parents:Child1" /> <xs:element name="Child2" type="xs:int" /> </xs:all> </xs:complexType> </xs:element> <!-- 其他位置直接引用即可 --> <xs:element ref="parents:Child1" />
内容的提问来源于stack exchange,提问作者sharpener
相关产品推荐
相关产品推荐

