At least one XML element without duplicates in XSD

I am trying to create a validation script where I want to select at least one non-repeating item from a list.

Somewhere along the lines:

<xs:choice minOccurs="1" maxOccurs="7">
    <xs:element name="Sunday"/>
    <xs:element name="Monday"/>
    <xs:element name="Tuesday"/>
    <xs:element name="Wednesday"/>
    <xs:element name="Thursday"/>
    <xs:element name="Friday"/>
    <xs:element name="Saturday"/>
</xs:choice>

However, the above solution allows me to display duplicate items in a list, which I don't want.

Valid XML example :

<Monday/>
<Tuesday/>
<Friday/>

Invalid XML Example :

<Monday/>
<Monday/>

Can this be done using XSD without the need for hard coding of all possible sequences? If so, how?

+4
source share
2 answers

XSD 1.0 solution

, XSD 1.0 " " ( . CM Sperberg-McQueen, ). xsd:unique, XPath, xsd:unique, name(), .

XSD 1.1

XSD 1.1 xs:assert:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" elementFormDefault="qualified"
  vc:minVersion="1.1">
  <xs:element name="Days">
    <xs:complexType>
      <xs:choice minOccurs="1" maxOccurs="7">
        <xs:element name="Sunday"/>
        <xs:element name="Monday"/>
        <xs:element name="Tuesday"/>
        <xs:element name="Wednesday"/>
        <xs:element name="Thursday"/>
        <xs:element name="Friday"/>
        <xs:element name="Saturday"/>
      </xs:choice>
      <xs:assert test="count(*[name() = following-sibling::*/name()]) = 0"/>
    </xs:complexType>
  </xs:element>  
</xs:schema>
+4

, . ,

<Monday/>
<Thursday/>

- , ,

<Thursday/>
<Monday/>

? , , , ,

<xs:complexType>
  <xs:sequence>
    <xs:element name="Sunday" minOccurs="0"/>
    <xs:element name="Monday" minOccurs="0"/>
    <xs:element name="Tuesday" minOccurs="0"/>
    <xs:element name="Wednesday" minOccurs="0"/>
    <xs:element name="Thursday" minOccurs="0"/>
    <xs:element name="Friday" minOccurs="0"/>
    <xs:element name="Saturday" minOccurs="0"/>
  </xs:choice>
</xs:complexType>

[]. , , . XSD 1.0 , , . , , ,...

<xs:complexType>
  <xs:choice>
    <xs:sequence>
      <xs:element name="Sunday"/>
      <xs:element name="Monday" minOccurs="0"/>
      <xs:element name="Tuesday" minOccurs="0"/>
      <xs:element name="Wednesday" minOccurs="0"/>
      <xs:element name="Thursday" minOccurs="0"/>
      <xs:element name="Friday" minOccurs="0"/>
      <xs:element name="Saturday" minOccurs="0"/>
    <xs:sequence>
    <xs:sequence>
      <xs:element name="Monday"/>
      <xs:element name="Tuesday" minOccurs="0"/>
      <xs:element name="Wednesday" minOccurs="0"/>
      <xs:element name="Thursday" minOccurs="0"/>
      <xs:element name="Friday" minOccurs="0"/>
      <xs:element name="Saturday" minOccurs="0"/>
    <xs:sequence>
    <xs:sequence>
      <xs:element name="Tuesday"/>
      <xs:element name="Wednesday" minOccurs="0"/>
      <xs:element name="Thursday" minOccurs="0"/>
      <xs:element name="Friday" minOccurs="0"/>
      <xs:element name="Saturday" minOccurs="0"/>
    <xs:sequence>
    <xs:sequence>
      <xs:element name="Wednesday" />
      <xs:element name="Thursday" minOccurs="0"/>
      <xs:element name="Friday" minOccurs="0"/>
      <xs:element name="Saturday" minOccurs="0"/>
    <xs:sequence>
    <xs:sequence>
      <xs:element name="Thursday"/>
      <xs:element name="Friday" minOccurs="0"/>
      <xs:element name="Saturday" minOccurs="0"/>
    <xs:sequence>
    <xs:sequence>
      <xs:element name="Friday" />
      <xs:element name="Saturday" minOccurs="0"/>
    <xs:sequence>
    <xs:sequence>
      <xs:element name="Saturday" />
    <xs:sequence>
  </xs:choice>
</xs:complexType>
+2

Source: https://habr.com/ru/post/1626361/


All Articles