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