Как повторно использовать переопределение simpleType в XSD - PullRequest
2 голосов
/ 10 октября 2011

Представьте, что есть определенный простой тип в definition.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 файла specificUse1.xsd и specificUse2.xsd , которые переопределяют два предыдущих xsds:

particularUse1.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>

particularUse2.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 в частностиUU1.1.xsd и ОСОБ 2.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 используется в specificUse1.xsd и specificUse2.xsd .

1 Ответ

7 голосов
/ 03 ноября 2011

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

The layout as described by the question.

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

Опция 1

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

Layout option 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>

specificUse1.xsd

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

specificUse2.xsd

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

Опция 2

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

Layout option 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>

specificUse2.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 showing the redefined type

...