XSD: добавление атрибутов в строго типизированные «простые» элементы - PullRequest
15 голосов
/ 17 марта 2009

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

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

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

Это денди. Однако я действительно хочу, чтобы все эти элементы также имели некоторые общие атрибуты, такие как, скажем, «format» и «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", который я там поставил ...

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

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

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

Ответы [ 3 ]

4 голосов
/ 24 января 2013

Не совсем ясно, какой аспект ручного решения вы считаете ужасным; если идея определить 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 голосов
/ 17 марта 2009

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

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

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

Марк

1 голос
/ 29 июня 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...