Чтобы исправить ошибку XSD, вот как должно выглядеть исправленное определение - оно в основном определяет элемент с содержимым emtpy.
<xsd:complexType name="objectType">
<xsd:attribute name="id" type="rId" use="required"/>
</xsd:complexType>
Это единственный способ, на самом деле. Попытка использования других комбинаций, которые будут работать с точки зрения структуры (с ограничением objectType objectDefType), не будет работать с точки зрения значения «производного» фасета: они не могут быть меньше значения родительского элемента.
Что касается другой части, я постараюсь объяснить мой мыслительный процесс, чтобы позволить вам улучшить его на основе ваших конкретных ограничений.
Я начал с того, что взял ваш XML и сгенерировал из него фиктивный XSD. Вот что он придумал, и он работает (он проверяет конкретный экземпляр XML):
<?xml version="1.0" encoding="utf-16"?>
<!--XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com)-->
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="recipe">
<xs:complexType>
<xs:sequence>
<xs:element name="equipment">
<xs:complexType>
<xs:sequence>
<xs:element name="bakeware">
<xs:complexType>
<xs:sequence>
<xs:element name="object">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="id" type="xs:unsignedByte" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="cookware">
<xs:complexType>
<xs:sequence>
<xs:element name="object">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="id" type="xs:unsignedByte" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="directions">
<xs:complexType>
<xs:sequence>
<xs:element name="step">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element name="object">
<xs:complexType>
<xs:attribute name="id" type="xs:unsignedByte" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="action" type="xs:string" use="required" />
<xs:attribute name="time" type="xs:unsignedByte" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="label" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Из этого первое, что вы заметите, это то, что с этим авторским стилем, называемым Russian Doll, поскольку все вложено, у вас будет два локальных, а следовательно, полностью независимых определения для тега объекта. Тогда это может стать основой для вашего решения, в зависимости от того, что и как вы хотите повторно использовать XSD-контент.
Самый простой способ иметь «контекст» - это сделать элемент локальным для вашего контекста. Для повторного использования частей одним из способов может быть либо сделать атрибут id и / или его тип глобальным. Или вернитесь к обсуждению сложных типов выше.
Надеюсь, это поможет ...