我有一个XML架构,里面有我的“video”元素和“youtube”元素:
<xs:element name="video">
<xs:complexType>
<xs:sequence>
<xs:element ref="youtube" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
<xs:attribute name="file" type="xs:string"/>
</xs:complexType>
</xs:element>
我想在可用的视频类型中添加另一个元素“param”:
<xs:element name="param">
<xs:complexType>
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="value" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
我会在“youtube”旁边放置“param”元素。
限制:
<video>
<youtube file = "aaa"/>
<param name="a1" value"b1"/>
<param name="a2" value"b2"/>
</video>
如何在此架构中维护此限制?
如果我这样做:
<xs:sequence>
<xs:element ref="youtube" minOccurs="0" maxOccurs="1"/>
<xs:element ref="param" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
如果序列是这样指定的
<xs:sequence>
<xs:element ref="youtube" minOccurs="0" maxOccurs="1"/>
<xs:element ref="param" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
它确定param必须在youtube之后 - 但我不想指定序列
答案 0 :(得分:3)
这是XSD架构:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="video">
<xs:complexType>
<xs:choice minOccurs="1" maxOccurs="2">
<xs:element ref="youtube"/>
<xs:element ref="param" minOccurs="1" maxOccurs="unbounded"/>
</xs:choice>
</xs:complexType>
</xs:element>
<xs:element name="youtube">
<xs:complexType>
<xs:attribute name="file" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="param">
<xs:complexType>
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="value" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>
示例(格式正确且有效)XML:
<?xml version="1.0" encoding="UTF-8"?>
<video>
<youtube file="aaa"/>
<param name="a1" value="b1"/>
<param name="a2" value="b2"/>
</video>
上述解决方案存在一个问题。 xs:choice允许两个youtube元素。有 xs:all 元素,它可以解决这个问题,但不幸的是,不可能让param的maxOccurs多于一个(xs:所有限制)。
换句话说,使用XML Schema 1.0没有100%的解决方案。如果上述还不够,您可以使用另一种模式语言,例如RELAX NG或Schematron。
编辑:
在XML Schema 1.1(XML Schema 1.0的超集)中,您可以将视频元素编写为:
<xs:element name="video">
<xs:complexType>
<xs:all>
<xs:element ref="youtube"/>
<xs:element ref="param" minOccurs="0" maxOccurs="unbounded"/>
</xs:all>
</xs:complexType>
</xs:element>