XSD: добавление атрибутов к строго типизированным "простым" элементам

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

Хорошо, у меня есть схема XSD, у которой есть миллион (er, сотни) элементов, которые могут выглядеть так:

<xsd:element name="DocumentDescription" type="xsd:string" />
<xsd:element name="DocumentDateTime" type="xsd:dateTime" />
<xsd:element name="DocumentSize" type="xsd:int" />

Это денди. Тем не менее, я действительно хочу, чтобы все эти элементы также имели некоторые общие атрибуты на них, например, "формат" и "isVisible". то есть иметь такую ​​схему, как:

<DocumentDescription isVisible="true">doc description</DocumentDescription>
<DocumentDateTime format="dd/mm/yyyy" isVisible="true">1/1/2008</DocumentDescription>
<DocumentSize format="0.00 KB" isVisible="false">5403</DocumentSize>

Я мог бы сделать это вручную и ужасно, добавив все такие атрибуты в XSD, когда я его сгенерирую, примерно так:

<xsd:element name="DocumentDescription" />
  <xsd:complexType>
    <xsd:simpleContent>
      <xsd:extension base="xsd:string">
        <xsd:attribute name="format" type="xsd:string" />
        <xsd:attribute name="isVisible" type="xsd:boolean" />
      </xsd:extension>
    </xsd:simpleContent>
  </xsd:complexType>
<xsd:element name="DocumentDateTime" />
   ... etc

... но в идеальном мире я бы скорее определил его как complexType:

<xsd:complexType name="customType">
  <xsd:complexContent>
    <xsd:extension base="???">
      <xsd:attribute name="format" type="xsd:string" />
      <xsd:attribute name="isVisible" type="xsd:boolean" />

... что означает, что я мог бы просто сделать:

<xsd:element name="DocumentDescription" type="customType" baseType="xsd:string" />
<xsd:element name="DocumentDateTime" type="customType" baseType="xsd:dateTime" />
<xsd:element name="DocumentSize" type="customType" baseType="xsd:int" />

Проблема с моим кодом "идеального мира" заключается в следующем:

a) У меня нет действительного <xsd:extension base-"???" > , так как мне действительно все равно, что я продюсирую; Я хочу расширить все типы. Похоже, что "xsd: anyType" подходит, но тогда элемент становится слабо типизированным контейнером, не так ли?

b) Я больше не могу указать простой тип на <xsd:element > , так как теперь тип является сложным "customType", который я определил. Следовательно, мнимый атрибут "baseType", который я там помещал...

Могу ли я добавлять атрибуты к простым типам в не-clunky? Или мне нужно определить дюжину complexTypes, которые все идентичны, за исключением простого типа, который они распространяют?

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

Я, наверное, смотрю на это не так! Любые советы приветствуются.

Ответ 1

[quote] может сделать это вручную, и ужасно,   добавление всех таких атрибутов в XSD   когда я его создаю, что-то вроде   это: [/цитата]

Я боюсь, что это ваш единственный "правильный", совместимый с XSD-схемой способ сделать это.

XSD иногда может быть запутан автором, но это помогает сохранять вещи в безопасности: -)

Марк

Ответ 2

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

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

<xs:attributeGroup name="globals">
  <xs:attribute name="format" type="xs:string"/>
  <xs:attribute name="isVisible" type="xs:boolean"/>
</xs:attributeGroup>

Объявления различных сложных типов, которые вам нужны, остаются повторяющимися, но теперь немного менее подробными:

<xs:complexType name="string">
  <xs:simpleContent>
    <xs:extension base="xs:string">
      <xs:attributeGroup ref="my:globals"/>
    </xs:extension>
  </xs:simpleContent>
</xs:complexType>
<xs:complexType name="dateTime">
  <xs:simpleContent>
    <xs:extension base="xs:dateTime">
      <xs:attributeGroup ref="my:globals"/>
    </xs:extension>
  </xs:simpleContent>
</xs:complexType>
<xs:complexType name="int">
  <xs:simpleContent>
    <xs:extension base="xs:int">
      <xs:attributeGroup ref="my:globals"/>
    </xs:extension>
  </xs:simpleContent>
</xs:complexType>

И объявления ваших элементов теперь немного проще, чем в вашем "идеальном" случае:

<xs:element name="DocumentDescription" type="my:string" />
<xs:element name="DocumentDateTime" type="my:dateTime" />
<xs:element name="DocumentSize" type="my:int" />

Ответ 3

Цель XSD - описать ваши данные. Цель атрибута типа XSD - описать или определить элемент. Вы хотите изменить определение элемента. Если вы меняете описание, измените тип. То, что вы пытаетесь сделать, это то, как положить колеса на мысль. "Но мне нужны колеса на моей мысли!" "Извините, не могу".