XSD для XML, содержащий XSD - PullRequest
1 голос
/ 16 марта 2019

Я создал схему XML для документа XML, который описывает функциональные возможности компонентов сложной модульной системы. В этот XML-документ я хочу включить XML-схему, которая будет считываться и анализироваться для обеспечения конфигурации.

meta-schema.xsd (сильно отредактировано для краткости):

<xs:schema targetNamespace="urn:project"
           xmlns="urn:project"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified">
  <xs:element name="Schema" type="SchemaType"/>
  <xs:complexType name="SchemaType">
    <xs:sequence>
      <xs:element type="ConfigurationType" name="Configuration"/>
      <xs:any maxOccurs="unbounded" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="ConfigurationType">
    <xs:sequence>
      <xs:element ref="xs:schema"/> <!-- Does not work -->
    </xs:sequence>
    <xs:anyAttribute/>
  </xs:complexType>
</xs:schema>

Желаемый XML (написанный людьми, разрабатывающими модули):

<Schema xmlns="urn:project"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="urn:project meta-schema.xsd">
    <!-- Snip -->
    <Configuration>
        <schema>
            <element name="enable" type="boolean">
                <annotation>
                    <appinfo>Usage:</appinfo>
                    <documentation xml:lang="en">
                        Enable functionality
                    </documentation>
                </annotation>
            </element>
        </schema>
    </Configuration>
</Schema>

Можно ли это выразить в XSD? Если да, то как?

Изменить:

На основании комментария kjhughes это невозможно. Мое решение состояло в том, чтобы использовать элемент any с пространством имен ##other с комментарием:

<xs:complexType name="ConfigurationType">
  <xs:choice>
    <xs:element name="hex" type="xs:hexBinary"/>
    <xs:element name="base64" type="xs:base64Binary"/>
    <!-- If configuration isn't binary, modules should create an XML Schema of the configuration options in order to
      facilitate future tooling, when feasible. -->
    <xs:any namespace="##other" processContents="lax"/>
  </xs:choice>
  <xs:anyAttribute/>
</xs:complexType>

, который включает следующий XML:

 <Schema xmlns="urn:project"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="urn:project meta-schema.xsd">
   <!-- Snip -->
   <Configuration>
      <xs:schema targetNamespace="urn:project"
                 xmlns="urn:project"
                 xmlns:xs="http://www.w3.org/2001/XMLSchema"
                 elementFormDefault="qualified">
         <xs:element name="enable" type="xs:boolean">
           <xs:annotation>
             <xs:appinfo>Usage:</xs:appinfo>
             <xs:documentation xml:lang="en">
               Enable left radial pulse functionality
             </xs:documentation>
           </xs:annotation>
         </xs:element>
      </xs:schema>
  </Configuration>
</Schema>

1 Ответ

2 голосов
/ 16 марта 2019

Связь между экземпляром документа XML и связанным с ним XSD устанавливается через xsi:schemaLocation или xsi:noNamespaceSchemaLocation.

Было бы весьма нетрадиционным пытаться физически включить XSD в XSD. (Не существует XSD-эквивалента для внутреннего подмножества XML DTD.)

Конечно, вы всегда можете добавить атрибут или элемент типа xs:anyURI, чтобы выразить такое соединение, но эта связь будет непрозрачной для семантики XML / XSD. Вы также можете использовать внешние объекты для включения любого файла, включая XSD, но, опять же, это уровень файла, а не механизм уровня XML / XSD.

...