Как повторно использовать переопределение 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.
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 (на основе иллюстрации).
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 показывает именно то, что вы хотите.