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/@DatumWertpapiergruppe/@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 命名空间后,它运行良好。