XSD 两个元素的两个属性的唯一约束不起作用
XSD unique constraint with two attributes of two elements does not work
我正在努力在我的 XSD 中创建一个唯一约束并尝试其他 SO 问题的解决方案确实让我更接近,但我无法解决我的问题。
奇怪的是,XMLSpy 显示我的约束是有效的,但是当我尝试使用 Notepad++ XML-Tools 验证违反约束的 XML 文件时,它告诉我文件“有效”。
我有一个元素 Zahlungstage
(德语为“付款日”)。在此之下,我有一个带有 Datum
属性的单个 Zahlungstag
(单个“付款日”)列表。
对于每个 Zahlungstag
,只有一个 Wertpapiergruppe
具有名为 ISIN
.
的属性
我要的是约束,保证Zahlungstag/@Datum
和Wertpapiergruppe/@ISIN
的组合是唯一的
这应该是有效的,因为组合是唯一的:
<Zahlungstage>
<Zahlungstag Datum="2020-01-01">
<Wertpapiergruppe ISIN="1">
<!-- Further elements-->
<Zahlungstag>
<Zahlungstag Datum="2020-01-01">
<Wertpapiergruppe ISIN="2">
<!-- Further elements-->
<Zahlungstag>
<Zahlungstag Datum="2020-01-02">
<Wertpapiergruppe ISIN="1">
<!-- Further elements-->
<Zahlungstag>
</Zahlungstage>
但这应该是无效的,因为 ISIN
和值 1
被同时使用了两次 Zahlungstag/@Datum
:
<Zahlungstage>
<Zahlungstag Datum="2020-01-01">
<Wertpapiergruppe ISIN="1">
<!-- Further elements-->
<Zahlungstag>
<Zahlungstag Datum="2020-01-01">
<Wertpapiergruppe ISIN="2">
<!-- Further elements-->
<Zahlungstag>
<Zahlungstag Datum="2020-01-01">
<Wertpapiergruppe ISIN="1"> <!-- Violation! -->
<!-- Further elements-->
<Zahlungstag>
</Zahlungstage>
这些是对应的元素定义
<xs:element name="Zahlungstage">
<xs:complexType>
<xs:sequence>
<xs:element name="Zahlungstag" type="ZahlungstagBescheinigungType" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:unique name="EindeutigerWertpapiergruppenZahlungstagMA11">
<xs:selector xpath="Zahlungstag"/>
<xs:field xpath="Wertpapiergruppe/@ISIN"/>
<xs:field xpath="@Datum"/>
</xs:unique>
</xs:element>
<xs:complexType name="ZahlungstagBescheinigungType">
<xs:complexContent>
<xs:extension base="ZahlungstagBasisType">
<xs:sequence>
<!-- Further elements -->
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="ZahlungstagBasisType">
<xs:sequence>
<xs:element name="Wertpapiergruppe" type="std:WertpapiergruppeType" minOccurs="1" maxOccurs="1">
</xs:element>
<!-- Further elements -->
</xs:sequence>
<xs:attribute name="Datum" type="xs:date" use="required">
</xs:attribute>
</xs:complexType>
<xs:complexType name="WertpapiergruppeType">
<xs:attribute name="ISIN" type="ISINType" use="required"> <!-- ISINType is a String with a regex -->
</xs:attribute>
<!-- Further attributes -->
</xs:complexType>
看评论好像约束还不错。和队友聊了很久,他想起了一个类似的问题,找到了SO question 22353302.
事实证明,constriant 是正确的,但由于 XSD 不是后来验证的根 XSD,验证会查找错误的命名空间。
在我将定义更改为 explizit 命名空间后,它运行良好。
我正在努力在我的 XSD 中创建一个唯一约束并尝试其他 SO 问题的解决方案确实让我更接近,但我无法解决我的问题。 奇怪的是,XMLSpy 显示我的约束是有效的,但是当我尝试使用 Notepad++ XML-Tools 验证违反约束的 XML 文件时,它告诉我文件“有效”。
我有一个元素 Zahlungstage
(德语为“付款日”)。在此之下,我有一个带有 Datum
属性的单个 Zahlungstag
(单个“付款日”)列表。
对于每个 Zahlungstag
,只有一个 Wertpapiergruppe
具有名为 ISIN
.
我要的是约束,保证Zahlungstag/@Datum
和Wertpapiergruppe/@ISIN
的组合是唯一的
这应该是有效的,因为组合是唯一的:
<Zahlungstage>
<Zahlungstag Datum="2020-01-01">
<Wertpapiergruppe ISIN="1">
<!-- Further elements-->
<Zahlungstag>
<Zahlungstag Datum="2020-01-01">
<Wertpapiergruppe ISIN="2">
<!-- Further elements-->
<Zahlungstag>
<Zahlungstag Datum="2020-01-02">
<Wertpapiergruppe ISIN="1">
<!-- Further elements-->
<Zahlungstag>
</Zahlungstage>
但这应该是无效的,因为 ISIN
和值 1
被同时使用了两次 Zahlungstag/@Datum
:
<Zahlungstage>
<Zahlungstag Datum="2020-01-01">
<Wertpapiergruppe ISIN="1">
<!-- Further elements-->
<Zahlungstag>
<Zahlungstag Datum="2020-01-01">
<Wertpapiergruppe ISIN="2">
<!-- Further elements-->
<Zahlungstag>
<Zahlungstag Datum="2020-01-01">
<Wertpapiergruppe ISIN="1"> <!-- Violation! -->
<!-- Further elements-->
<Zahlungstag>
</Zahlungstage>
这些是对应的元素定义
<xs:element name="Zahlungstage">
<xs:complexType>
<xs:sequence>
<xs:element name="Zahlungstag" type="ZahlungstagBescheinigungType" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:unique name="EindeutigerWertpapiergruppenZahlungstagMA11">
<xs:selector xpath="Zahlungstag"/>
<xs:field xpath="Wertpapiergruppe/@ISIN"/>
<xs:field xpath="@Datum"/>
</xs:unique>
</xs:element>
<xs:complexType name="ZahlungstagBescheinigungType">
<xs:complexContent>
<xs:extension base="ZahlungstagBasisType">
<xs:sequence>
<!-- Further elements -->
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="ZahlungstagBasisType">
<xs:sequence>
<xs:element name="Wertpapiergruppe" type="std:WertpapiergruppeType" minOccurs="1" maxOccurs="1">
</xs:element>
<!-- Further elements -->
</xs:sequence>
<xs:attribute name="Datum" type="xs:date" use="required">
</xs:attribute>
</xs:complexType>
<xs:complexType name="WertpapiergruppeType">
<xs:attribute name="ISIN" type="ISINType" use="required"> <!-- ISINType is a String with a regex -->
</xs:attribute>
<!-- Further attributes -->
</xs:complexType>
看评论好像约束还不错。和队友聊了很久,他想起了一个类似的问题,找到了SO question 22353302.
事实证明,constriant 是正确的,但由于 XSD 不是后来验证的根 XSD,验证会查找错误的命名空间。
在我将定义更改为 explizit 命名空间后,它运行良好。