XSD 中元素的唯一值
Unique value across elements in XSD
我试图在多个 complexType 元素中使用的元素中强制使用唯一值。
例如:
<xs:element name="lmt">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element ref="lf" maxOccurs="unbounded"/>
<xs:element ref="cdl" maxOccurs="unbounded"/>
</xs:choice>
</xs:complexType>
<xs:unique name="uniquePos">
<xs:selector xpath="./*/pos"/>
<xs:field xpath="."/>
</xs:unique>
</xs:element>
<xs:element name="pos">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:pattern value="\d{1}"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="lf">
<xs:complexType>
<xs:sequence>
<xs:element ref="pos"/>
... more elements ...
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="cdl">
<xs:complexType>
<xs:sequence>
<xs:element ref="pos"/>
... more elements ...
</xs:sequence>
</xs:complexType>
</xs:element>
如果我有类似的东西,我希望它失败:
<lmt>
<lf>
<pos>1</pos>
... more elements ...
</lf>
<cdl>
<pos>1</pos>
... more elements ...
</cdl>
</lmt>
但验证
<lmt>
<lf>
<pos>1</pos>
... more elements ...
</lf>
<cdl>
<pos>2</pos>
... more elements ...
</cdl>
</lmt>
目前两者似乎都有效。我已经为选择器尝试了 ./*/pos
和 .//pos
,但要么导致第一个示例验证失败。
如果您希望元素 A 中的每个 B 都对 C 具有唯一值,那么您的唯一性约束应该定义在元素 A 上,selector
表达式应该 select 来自 A 的 B,并且field
表达式应该 select C from B.
因此,在您的情况下,应在您未向我们展示的容器元素上定义约束,该元素的子元素为 lf
和 cdl
。 selection 应该是 .//pos
或者 ./*/pos
,然后场应该是 .
我试图在多个 complexType 元素中使用的元素中强制使用唯一值。
例如:
<xs:element name="lmt">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element ref="lf" maxOccurs="unbounded"/>
<xs:element ref="cdl" maxOccurs="unbounded"/>
</xs:choice>
</xs:complexType>
<xs:unique name="uniquePos">
<xs:selector xpath="./*/pos"/>
<xs:field xpath="."/>
</xs:unique>
</xs:element>
<xs:element name="pos">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:pattern value="\d{1}"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="lf">
<xs:complexType>
<xs:sequence>
<xs:element ref="pos"/>
... more elements ...
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="cdl">
<xs:complexType>
<xs:sequence>
<xs:element ref="pos"/>
... more elements ...
</xs:sequence>
</xs:complexType>
</xs:element>
如果我有类似的东西,我希望它失败:
<lmt>
<lf>
<pos>1</pos>
... more elements ...
</lf>
<cdl>
<pos>1</pos>
... more elements ...
</cdl>
</lmt>
但验证
<lmt>
<lf>
<pos>1</pos>
... more elements ...
</lf>
<cdl>
<pos>2</pos>
... more elements ...
</cdl>
</lmt>
目前两者似乎都有效。我已经为选择器尝试了 ./*/pos
和 .//pos
,但要么导致第一个示例验证失败。
如果您希望元素 A 中的每个 B 都对 C 具有唯一值,那么您的唯一性约束应该定义在元素 A 上,selector
表达式应该 select 来自 A 的 B,并且field
表达式应该 select C from B.
因此,在您的情况下,应在您未向我们展示的容器元素上定义约束,该元素的子元素为 lf
和 cdl
。 selection 应该是 .//pos
或者 ./*/pos
,然后场应该是 .