的assert
爲
這樣
not(./*/local-name-from-QName(node-name(.)) = 'put-name-to-exclude-here')
可以做的伎倆,但需要XML架構1.1。
例如,使用一組(即,這在技術上是不完全受限制的推導):
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1">
<xs:group name="base">
<xs:sequence>
<xs:element name="a" type="xs:string" minOccurs="0"/>
<xs:element name="b" type="xs:string" minOccurs="0"/>
<xs:element name="c" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:group>
<xs:complexType name="excluding-a">
<xs:sequence>
<xs:group ref="base"/>
</xs:sequence>
<xs:assert test="not(./*/local-name-from-QName(node-name(.)) = 'a')"/>
</xs:complexType>
<xs:element name="root" type="excluding-a"/>
</xs:schema>
這將是有效的:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<b/>
<c/>
</root>
,這將是無效的:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<a/>
<b/>
<c/>
</root>
明確使用派生的另一種方法涉及通過擴展推導,如un聽起來很直觀(限制將需要重複所有元素)。這是因爲關於派生的XML Schema的語義在值空間包含方面並不嚴格:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1">
<xs:complexType name="base">
<xs:sequence>
<xs:element name="a" type="xs:string" minOccurs="0"/>
<xs:element name="b" type="xs:string" minOccurs="0"/>
<xs:element name="c" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="derived">
<xs:complexContent>
<xs:extension base="base">
<xs:assert test="not(*/local-name-from-QName(node-name(.)) = 'a')"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="root" type="derived"/>
</xs:schema>
哦,看起來不錯!我今晚會測試一下。版本1.1和使用內部類的組正是我想要的。 –