XSD :如何使用取决于第一个值的序列来验证此 xml?
XSD : how to validate this xml, with sequences depending on the value of the first one?
我有 3 种 XML 块,不包含 "filter" 块,或者 "filter" 和 "invalidation" 其第一个值是 "fixed1" 或 "fixed2";如果"fixed1":没有别的,如果"fixed2",这个序列A1,A2,A3(见下文):
<filter>
<invalidation>fixed1</invalidation>
</filter>
<filter>
<invalidation>fixed2</invalidation>
<A1>string...</A1>
<A2>string...</A2>
<A2>string...</A3>
</filter>
如何验证这个?我觉得有一些使用 xs:choice 的解决方案,但我找不到。
我找到的唯一(糟糕)解决方案是:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
...
<xs:simpleType name="invalidation">
<xs:restriction base="xs:string">
<xs:pattern value="fixed1|fixed2"/>
</xs:restriction>
</xs:simpleType>
...
<xs:element name="filter" minOccurs="0">
<xs:complexType>
<xs:all>
<xs:element name="invalidation" type="invalidation"/>
<xs:element name="A1" type="xs:string" minOccurs="0"/>
<xs:element name="A2" type="xs:string" minOccurs="0"/>
<xs:element name="A3" type="xs:string" minOccurs="0"/>
</xs:all>
</xs:complexType>
</xs:element>
这不能在 XSD 1.0 中完成。
可以在 XSD 1.1 中使用断言来完成。使用内容模型 (invalidation, (A1, A2, A3)?)
将结构定义为序列,然后定义一个断言:not(invalidation='fixed1' and exists(A1))
.
XSD 1.1 在 Altova、Saxon 和 Apache Xerces 中受支持,但在其他产品中不受支持,例如 Java 和 .NET 中的内置验证器。
我有 3 种 XML 块,不包含 "filter" 块,或者 "filter" 和 "invalidation" 其第一个值是 "fixed1" 或 "fixed2";如果"fixed1":没有别的,如果"fixed2",这个序列A1,A2,A3(见下文):
<filter>
<invalidation>fixed1</invalidation>
</filter>
<filter>
<invalidation>fixed2</invalidation>
<A1>string...</A1>
<A2>string...</A2>
<A2>string...</A3>
</filter>
如何验证这个?我觉得有一些使用 xs:choice 的解决方案,但我找不到。
我找到的唯一(糟糕)解决方案是:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
...
<xs:simpleType name="invalidation">
<xs:restriction base="xs:string">
<xs:pattern value="fixed1|fixed2"/>
</xs:restriction>
</xs:simpleType>
...
<xs:element name="filter" minOccurs="0">
<xs:complexType>
<xs:all>
<xs:element name="invalidation" type="invalidation"/>
<xs:element name="A1" type="xs:string" minOccurs="0"/>
<xs:element name="A2" type="xs:string" minOccurs="0"/>
<xs:element name="A3" type="xs:string" minOccurs="0"/>
</xs:all>
</xs:complexType>
</xs:element>
这不能在 XSD 1.0 中完成。
可以在 XSD 1.1 中使用断言来完成。使用内容模型 (invalidation, (A1, A2, A3)?)
将结构定义为序列,然后定义一个断言:not(invalidation='fixed1' and exists(A1))
.
XSD 1.1 在 Altova、Saxon 和 Apache Xerces 中受支持,但在其他产品中不受支持,例如 Java 和 .NET 中的内置验证器。