ThomasM: XML-Schema

Beitrag lesen

Hallo Julia,

auf eine alleinige Lösung mit xsd:unique, xsd:key, xsd:keyref bin ich zunächst nicht gekommen.

Hier ein alternativer Lösungsversuch mit xsd:unique für author/@id, wobei zusätzlich der Typ xsd:ID zum Einsatz kommt und Erweiterung mit xsd:assert aus XML Schema 1.1, was mächtigere XPath-Ausdrücke vor allem unter Nutzung von XPath-Funktionen erlaubt:

<?xml version="1.1" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1">
  <xsd:element name="library" type="libraryType"/>

  <xsd:element name="book" type="bookType"/>

  <xsd:element name="author" type="authorType">
    <xsd:unique name="AuthorUnique">
      <xsd:selector xpath="author"/>
      <xsd:field xpath="@id"/>
    </xsd:unique>
  </xsd:element>

  <xsd:complexType name="libraryType">
    <xsd:sequence>
      <xsd:element type="bookType" name="book" minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element type="authorType" name="author" minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="bookType" mixed="true">
    <xsd:sequence>
      <xsd:element type="xsd:string" name="author-ref" maxOccurs="unbounded"/>
      <xsd:element type="xsd:string" name="title"/>
      <xsd:element type="xsd:string" name="language" minOccurs="0"/>
      <xsd:element type="xsd:integer" name="year" minOccurs="0"/>
    </xsd:sequence>
    <xsd:assert test="count(distinct-values(author-ref)) = count(author-ref)"/>
  </xsd:complexType>

  <xsd:complexType name="authorType">
    <xsd:sequence>
      <xsd:element type="xsd:string" name="last-name"/>
      <xsd:element type="xsd:string" name="first-name"/>
    </xsd:sequence>
    <xsd:attribute type="xsd:ID" name="id" use="required"/>
  </xsd:complexType>
</xsd:schema>


Damit lassen sich keine author-Elemente mit mehrfachem Vorkommen derselben ID verwenden und falls mehrere author-ref-Kindelemente unterhalb von book vorkommen, müssen deren Inhalte verschiedene Autoren sein.

BTW: Die XML-Version 1.1 ist für XML/XSD keine Bedingung, 1.0 reicht.

Grüße,
Thomas