Как повторно использовать переопределение simpleType в XSD

Представьте, что в определении есть определенный простой тип. Xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:simpleType name="myType">
        <xs:restriction base="xs:string" />
    </xs:simpleType>
</xs:schema>

Затем тип используется в 2 разных xsds: use1.xsd и use2.xsd:

use1.xsd:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">    
    <xs:include schemaLocation="definition.xsd"></xs:include>    
    <xs:complexType name="ComplexType1">
        <xs:attribute name="typeInstance1" type="myType" use="required" />
    </xs:complexType>
</xs:schema>

use2.xsd:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">    
    <xs:include schemaLocation="definition.xsd"></xs:include>    
    <xs:complexType name="ComplexType2">
        <xs:attribute name="typeInstance2" type="myType" use="required" />
    </xs:complexType>
</xs:schema>

Затем есть 2 файла, которые имеют имя specialUse1.xsd и specificUse2.xsd, которые переопределяют два предыдущих xsds:

specificUse1.xsd:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:redefine schemaLocation="use1.xsd">
        <xs:simpleType name="myType">
            <xs:restriction base = "myType">
                <xs:enumeration value = "value1"/>
                <xs:enumeration value = "value2"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:redefine>
</xs:schema>

specificUse2.xsd:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:redefine schemaLocation="use2.xsd">
    <xs:simpleType name="myType">
        <xs:restriction base = "myType">
            <xs:enumeration value = "value1"/>
            <xs:enumeration value = "value2"/>
        </xs:restriction>
    </xs:simpleType>
</xs:redefine>
</xs:schema>

Теперь вопрос: как я могу повторно использовать переопределение myType в частности Use1.xsd и конкретном U2.2.ssd, чтобы они не дублировались.

В идеале это был бы другой файл reused.xsd:

    <xs:simpleType name="myType">
        <xs:restriction base = "myType">
            <xs:enumeration value = "value1"/>
            <xs:enumeration value = "value2"/>
        </xs:restriction>
    </xs:simpleType>

Ссылка из файла reused.xsd используется в частности Use1.xsd и частности Use2.xsd.

1 ответ

Ответ на самом деле зависит от того, какие ограничения вы накладываете на файлы XSD, их использование и инструменты, которые вы будете использовать для использования файлов схемы XML. Эта диаграмма показывает расположение файлов, как описано в вопросе.

Макет, как описано в вопросе

Поскольку вы переопределяете use1.xsd и use2.xsd, я бы предположил, что эти два не доступны для редактирования (обычно выпускаются / поддерживаются кем-то другим).

Опция 1

Один из способов - удалить переопределения из specificUse #.xsd, поместить переопределение в reused.xsd и убедиться, что все файлы используются вместе (например, в.NET у вас есть объект XmlSchemaSet, который необходимо использовать повторно. xsd и один или оба из конкретного пользователя #.xsd, добавленные в набор). Имея файлы в области видимости, модель PSVI будет фактически использовать переопределенный myType, даже несмотря на то, что reused.xsd не имеет явной ссылки ни в каком конкретном файле #Us #.xsd.

Вариант макета 1

reused.xsd

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XSR Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified"     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:redefine schemaLocation="definition.xsd">
    <xsd:simpleType name="myType">
      <xsd:restriction base="myType">
        <xsd:enumeration value="value1"/>
        <xsd:enumeration value="value2"/>
    </xsd:restriction>
    </xsd:simpleType>
  </xsd:redefine>
</xsd:schema>

particularUse1.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation="use1.xsd"/>
</xs:schema> 

particularUse2.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation="use2.xsd"/>
</xs:schema>

Вариант 2

Эта другая опция должна работать с большинством основных редакторов XML-схем, и она даст вам переопределенный myType при открытии только файла specialUse #.xsd; это при условии, что вы не возражаете потянуть область действия для instanceUse2.xsd содержимого из use1.xsd (на основе иллюстрации).

Вариант макета 2

reused.xsd

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XSR Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified"     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:redefine schemaLocation="use1.xsd">
    <xsd:simpleType name="myType">
      <xsd:restriction base="myType">
        <xsd:enumeration value="value1"/>
        <xsd:enumeration value="value2"/>
    </xsd:restriction>
    </xsd:simpleType>
  </xsd:redefine>
</xsd:schema>

particularUse2.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation="reused.xsd"/>
    <xs:include schemaLocation="use2.xsd"/>
</xs:schema>

Независимо от варианта, PSVI показывает именно то, что вы хотите.

PSVI показывает переопределенный тип

Другие вопросы по тегам