我有一个情况有一个基本类型,我没有“自己的”,它可以让所有子元素是可选的。 从一般企业的角度来看这是有道理的。 例如,说这是:
<xs:complexType name="BaseType">
<xs:sequence>
<xs:element name="id" type="xs:string" minOccurs="0"/>
<xs:element name="name" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
这种类型的实例将包含在我的过程中使用含有类型。
<xs:complexType name="MyType">
<xs:sequence>
<xs:element name="Widget" type="BaseType"/>
...other stuff...
<xs:sequence>
</xs:complexType>
但是,对于我的特殊目的,我需要一个基本类型的“身份证”元素是存在始终。 我可以在消耗它,当然代码执行这一点,但有一些方法在XSD来表示呢?
编辑我忘了另外一个。 还有一个,类似的情况,在这里我使用的元素为一组,而不是基本类型英寸
<xs:group name="Address-Group">
<xs:sequence>
<xs:element name="street" type="xs:string" minOccurs="0"/>
<xs:element name="city" type="xs:string" minOccurs="0"/>
...etc....
</xs:sequence>
</xs:group>
如果我使用这些之一的MyType,我不得不对试图重写的minOccurs为类似“城市”同样的问题。
假设for my particular purposes, I need the 'id' element on a BaseType to be present always
你的真正用意始终,那么你可以申请一个重新定义,如下面的一个:
<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XSR Module (http://www.paschidev.com)-->
<xsd:schema xmlns="http://tempuri.org/XMLSchema.xsd" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://tempuri.org/XMLSchema.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:redefine schemaLocation="xsd-overriding-minoccurs-from-a-group.xsd">
<xsd:complexType name="BaseType">
<xsd:complexContent>
<xsd:restriction base="BaseType">
<xsd:sequence>
<xsd:element name="id" type="xsd:string"/>
<xsd:element name="name" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
<xsd:group name="Address-Group">
<xsd:sequence>
<xsd:element name="street" type="xsd:string"/>
<xsd:element name="city" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
</xsd:group>
</xsd:redefine>
</xsd:schema>
问题是,重新定义的作品“永远”,即在一个基本类型时,重新定义的定义将优先考虑所有实例。 换句话说,没有内置的XSD机制下,您可能能够挑选你的背景下,除非你移动到XSD 1.1,你就不会再需要重新定义,但有些类型的声明。 问题是,我冒昧地说,XSD 1.1甚至更低的支持比XSD 1.0(跨平台的,而不是在一个特定的一个可能发生的同时支持,无论如何,如萨克森或Xerces的)。
一个XML等,这是有效的:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<paschidev.dummy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="BaseType" xmlns="http://tempuri.org/XMLSchema.xsd">
<id>id1</id>
<name>name1</name>
</paschidev.dummy>
而这一次会失败:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<paschidev.dummy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="BaseType" xmlns="http://tempuri.org/XMLSchema.xsd">
<name>name1</name>
</paschidev.dummy>
用下面的错误消息(基于.NET):
Error occurred while loading [], line 4 position 3
The element 'paschidev.dummy' in namespace 'http://tempuri.org/XMLSchema.xsd' has invalid child element 'name' in namespace 'http://tempuri.org/XMLSchema.xsd'. List of possible elements expected: 'id' in namespace 'http://tempuri.org/XMLSchema.xsd'.
或本(基于Java):
Error while loading [], line 4 position 8
cvc-complex-type.2.4.a: Invalid content was found starting with element 'name'. One of '{"http://tempuri.org/XMLSchema.xsd":id}' is expected.
在重新定义XSD感知的XML处理器效果很好。 然而,一些XSD编写绑定框架或数据库引擎内置的XSD支持这一个可能会咳嗽。