Схема XML: Елемент з атрибутами, що містять лише текст?


133

У мене виникають труднощі з пошуком цього. Як би я визначив елемент у файлі схеми XML для XML, який виглядає приблизно так:

<option value="test">sometext</option>

Я не можу зрозуміти, як визначити елемент типу, який xs:stringтакож має атрибут.

Ось що у мене поки що:

<xs:element name="option">
    <xs:complexType>
        <xs:attribute name="value" type="xs:string" />
    </xs:complexType>
</xs:element>

Відповіді:


168

Спробуйте

  <xs:element name="option" type="AttrElement" />

  <xs:complexType name="AttrElement">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="value" type="xs:string">
        </xs:attribute>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

Я отримую наступне виняток із спробу вашого коду - org.xml.sax.SAXParseException: src-resolution: Неможливо r визначити ім'я "AttrElement" до компонента (n) "визначення типу". Чому це так?
Ешвін

1
Якщо це так, це, мабуть, тому, що у вашому документі схеми є цільовий простір імен, і вам потрібно буде використовувати вказівне ім’я, щоб вказати на тип. (Якщо префікс tnsпов'язаний з цільовим простором імен документа схеми, ви будете використовувати type="tns:AttrElement"для позначення типу.)
CM Sperberg-McQueen

@Ashwin вам може знадобитися посилання типу на простір імен типів ( type="tns:AtrElement"якщо у вашому просторі імен XSD за замовчуванням є xs, а не цільовий простір імен документа. Зазвичай у цьому випадку tnsвизначається і використовується.
eckes

75

... або вбудований еквівалент:

<xs:element name="option">
  <xs:complexType>
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="value" type="xs:string" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:element>

11
Мені здається, що це дійсно неінтуїтивно визначати simpleContentв межах complexType. Але знову ж таки це XSD, де нічого не здається справді інтуїтивним. Спасибі все-таки! :-)
грип

Це покаже для мене помилку в IntelliJ ( V12.1.3 ): атрибут значення "не дозволений". Використовуючи комплексContent замість simpleContent виправив його.
aZen

@CrBruno краще відкрити спеціальне запитання щодо цього. Не соромтеся посилатися на це тут у коментарях (і вказуйте на цю дискусію)
eckes

-2

Я знаю, що це не те саме, але це працює для мене:

<xsd:element name="option">
    <xsd:complexType mixed="true">
        <xsd:attribute name="value" use="optional" type="xsd:string"/>
    </xsd:complexType>
</xsd:element>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.