【问题标题】:XSD unique constraint with two attributes of two elements does not work具有两个元素的两个属性的 XSD 唯一约束不起作用
【发布时间】:2020-11-25 06:53:47
【问题描述】:

我正在努力在我的 XSD 中创建一个独特的约束,并尝试其他 SO 问题的解决方案确实让我更接近,但我无法解决我的问题。 奇怪的是,XMLSpy 显示我的约束是有效的,但是当我尝试验证违反约束的 XML 文件时,使用 Notepad++ XML-Tools 它告诉我文件“有效”。

我有一个元素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>

【问题讨论】:

  • 也许您需要更新您的 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


【解决方案1】:

根据 cmets 的说法,约束似乎很好。和队友聊了很久,想起了一个类似的问题,找到了SO question 22353302

事实证明,constriant 是正确的,但由于 XSD 不是后来验证的根 XSD,因此验证会查找错误的命名空间。

在我将定义更改为显式命名空间后,它运行良好。

【讨论】:

    猜你喜欢
    • 2019-01-10
    • 2013-01-18
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多