我想创建一个模式,强制跨相关元素进行内容验证。如果第一个元素的内容是“ApplicationY”,那么下一个元素必须是可见的和必需的。
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Instructions">
<xs:complexType>
<xs:sequence>
<xs:element name="Applications" >
<xs:complexType>
<xs:sequence>
<xs:element name="Application" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="ApplicationName">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="ApplicationX"/>
<xs:enumeration value="ApplicationY"/>
<xs:enumeration value="ApplicationZ"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="NextElementOnlyForApplicationY">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="Yes"/>
<xs:enumeration value="No"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
答案 0 :(得分:0)
架构无法做到这一点。架构可以做两件事:
架构无法对元素强制执行另一个元素的内容。
你可以做的是创建一个抽象的基本元素Application
,它有更多的特定元素(例如ApplicationY
)代替它们。更具体的元素可能需要额外的子元素或属性。
架构:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="http://mynamespace" targetNamespace="http://mynamespace">
<xs:element name="Instructions">
<xs:complexType>
<xs:sequence>
<xs:element name="Applications" >
<xs:complexType>
<xs:sequence>
<xs:element ref="my:Application" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Application" abstract="true" />
<xs:element name="ApplicationX" substitutionGroup="my:Application" />
<xs:element name="ApplicationY" substitutionGroup="my:Application">
<xs:complexType>
<xs:sequence>
<xs:element name="ElementForApplicationY">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="Yes"/>
<xs:enumeration value="No"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="ApplicationZ" substitutionGroup="my:Application" />
</xs:schema>
文件:
<?xml version="1.0" encoding="utf-8"?>
<my:Instructions xmlns:my="http://mynamespace">
<Applications>
<my:ApplicationX />
<my:ApplicationY>
<ElementForApplicationY>Yes</ElementForApplicationY>
</my:ApplicationY>
<my:ApplicationZ />
</Applications>
</my:Instructions>
请注意,使用替换组要求元素是模式级元素,而不是内部元素。这意味着您需要定义命名空间。