【发布时间】:2020-11-25 06:53:47
【问题描述】:
我正在努力在我的 XSD 中创建一个独特的约束,并尝试其他 SO 问题的解决方案确实让我更接近,但我无法解决我的问题。 奇怪的是,XMLSpy 显示我的约束是有效的,但是当我尝试验证违反约束的 XML 文件时,使用 Notepad++ XML-Tools 它告诉我文件“有效”。
我有一个元素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>
【问题讨论】:
-
也许您需要更新您的 notepad++ xml 工具扩展,因为对我来说它正在正常工作。您定义为有效的示例确实有效,无效确实会给出错误,例如受约束的唯一身份的重复键。只需确保从内容中删除 xsi:nonamespace 声明,因此您需要将 xsd 的位置提供给 notepad++。如果你把它留在记事本++中会发现它是有效的。
-
@martijn 您使用哪个版本?我在 2.4.11 x64(正如我刚刚看到的那样已经很老了)
-
notepad++ V7.9 (32bit) xml工具3.0.4.2
-
我同意 Martijn,您的架构看起来不错,我认为问题出在您的工具或您使用它们的方式上。
-
由于不允许我自己更新插件,我会尝试寻找另一种方法。用 JAVA 验证了我的文件,并且也没有声称违反了唯一约束:( 我会保持最新
标签: xml xsd constraints