Можем ли мы добавить новый атрибут или изменить тип существующего атрибута на «Ссылочный элемент»? - PullRequest
1 голос
/ 15 июня 2010

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

Примерно так:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.myDomain.com" xmlns="http://www.myDomain.com" elementFormDefault="qualified">

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

  <xs:element name="myElement">
    <xs:complexType mixed="true">
      <xs:attribute name="attr1" type="xs:string" />
      <xs:attribute name="attr2" type="xs:string" />
    </xs:complexType>
  </xs:element>

  <xs:element name="MainElement1">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="myElement">
          <xs:complexType>
            <xs:attribute name="myAtt" type="myValues1" />
          </xs:complexType>
        </xs:element>
      </xs:sequence>
      <xs:attribute name="mainAtt1" />
    </xs:complexType>
  </xs:element>

</xs:schema>

Или мы можем изменить тип существующего атрибута "Ссылочный элемент" в XML-схеме?
как то так:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.myDomain.com" xmlns="http://www.myDomain.com" elementFormDefault="qualified">

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

  <xs:simpleType name="myValues2">
    <xs:restriction base="xs:string">
      <xs:enumeration value="value3" />
      <xs:enumeration value="value4" />
    </xs:restriction>
  </xs:simpleType>

  <xs:element name="myElement">
    <xs:complexType mixed="true">
      <xs:attribute name="attr1" type="xs:string" />
      <xs:attribute name="attr2" type="xs:string" />
      <xs:attribute name="myAtt" type="myValues1" />
    </xs:complexType>
  </xs:element>

  <xs:element name="MainElement1">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="myElement">
          <xs:complexType>
            <xs:attribute name="myAtt" type="myValues2" />
          </xs:complexType>
        </xs:element>
      </xs:sequence>
      <xs:attribute name="mainAtt1" />
    </xs:complexType>
  </xs:element>

</xs:schema>

1 Ответ

0 голосов
/ 18 июня 2010

Вы не можете переопределить модель содержимого ссылочного элемента. Суть ссылки в том, что она указывает точно один и тот же элемент каждый раз.

Если вы действительно хотите, чтобы элемент имел разное содержимое, лучше определить несколько глобальных сложных типов и использовать их, а не использовать ссылку на элемент:

<xs:complexType name="Type1" mixed="true">
   <xs:attribute name="attr1" type="xs:string" />
   <xs:attribute name="attr2" type="xs:string" />
   <xs:attribute name="myAtt" type="myValues1" />
</xs:complexType>

<xs:complexType name="Type2" mixed="true">
   <xs:complexContent>
      <xs:extension base="Type1">
         <xs:attribute name="myAtt2" type="myValues2" />
      </xs:extension>
   </xs:complexContent>
</xs:complexType>

<xs:element name="MainElement1">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="myElement" type="Type1"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Я бы не слишком беспокоился о производительности. Ссылка на глобальные типы будет разрешена только один раз во время загрузки схемы.

...