我有3种XML块,不包含"filter“块或带有”失效“的"filter”块,其第一个值为"fixed1“或"fixed2";if "fixed1":nothing,if "fixed2",这个序列A1,A2,A3 (见下文):
<filter>
<invalidation>fixed1</invalidation>
</filter>
<filter>
<invalidation>fixed2</invalidation>
<A1>string...</A1>
<A2>string...</A2>
<A2>string...</A3>
</filter>如何验证这一点?我觉得有一些使用xs:选择的解决方案,但我找不到。
我找到的唯一(糟糕的)解决方案是:
<?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>发布于 2017-03-29 15:03:00
这在XSD1.0中是无法做到的。
它可以在XSD1.1中使用断言完成。使用内容模型(invalidation, (A1, A2, A3)?)将结构定义为序列,然后定义断言:not(invalidation='fixed1' and exists(A1))。
Altova、Saxon和Apache支持XSD1.1,但在其他产品(如Java和.NET中的内置验证器)中则不支持XSD1.1。
https://stackoverflow.com/questions/43092399
复制相似问题