Схема XML Як обмежити атрибут переліченням


85

У мене є такий тег XML

<price currency="euros">20000.00</price>

Як обмежити атрибут валюти одним із таких:

  • євро
  • фунтів
  • доларів

А ціна вдвічі?

Я просто отримую повідомлення про помилку, коли я намагаюся набрати тип на обох, ось що я маю на сьогодні:

<xs:element name="price">
    <xs:complexType>
        <xs:attribute name="currency">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:enumeration value="pounds" />
                    <xs:enumeration value="euros" />
                    <xs:enumeration value="dollars" />
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
</xs:element>

1
Якщо ви це зробите, вам потрібно також видалити type = "xs: string" з елемента <xs: attribute>. Ви не можете вказати тип, коли присутній simpleType або complexType.
Сал

Відповіді:


116

Здається, числове значення відсутнє у вашому визначенні ціни. Спробуйте наступне:

<xs:simpleType name="curr">
  <xs:restriction base="xs:string">
    <xs:enumeration value="pounds" />
    <xs:enumeration value="euros" />
    <xs:enumeration value="dollars" />
  </xs:restriction>
</xs:simpleType>



<xs:element name="price">
        <xs:complexType>
            <xs:extension base="xs:decimal">
              <xs:attribute name="currency" type="curr"/>
            </xs:extension>
        </xs:complexType>
</xs:element>

3
Як відповів @kjhughes, the <xs:extensionне може бути безпосередньо нащадком, <xs:complexTypeале замість цього також повинен міститись <xs:complexContentабо <xs:simpleContent.
HankCa

22

Нова відповідь на старе запитання

Жодна з існуючих відповідей на це старе питання не стосується справжньої проблеми.

Справжня проблема полягала в тому, щоxs:complexTypeне можна безпосередньо матиxs:extensionдитину в XSD. Виправлення полягає у використанніxs:simpleContentспочатку. Деталі слідують ...


Ваш XML,

<price currency="euros">20000.00</price>

буде дійсним щодо будь- якого з наступних виправлених XSD:

Локально визначений тип атрибута

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

  <xs:element name="price">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:decimal">
          <xs:attribute name="currency">
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:enumeration value="pounds" />
                <xs:enumeration value="euros" />
                <xs:enumeration value="dollars" />
              </xs:restriction>
            </xs:simpleType>
          </xs:attribute>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
</xs:schema>

Глобально визначений тип атрибута

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

  <xs:simpleType name="currencyType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="pounds" />
      <xs:enumeration value="euros" />
      <xs:enumeration value="dollars" />
    </xs:restriction>
  </xs:simpleType>

  <xs:element name="price">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:decimal">
          <xs:attribute name="currency" type="currencyType"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
</xs:schema>

Примітки

  • Як прокоментував @Paul , вони дійсно змінюють тип вмісту priceз xs:stringна xs:decimal, але це не є суворо необхідним і не було справжньою проблемою.
  • Як відповів @ user998692 , ви можете відокремити визначення валюти та змінити на xs:decimal, але це теж не було справжньою проблемою.

Справжня проблема полягала в тому, що xs:complexTypeне можна безпосередньо мати xs:extensionдитину в XSD; xs:simpleContentпотрібно спочатку.

Пов’язане питання (яке не задавали, але, можливо, переплутали інші відповіді):

Як можна priceобмежити, якщо він має атрибут?

У цьому випадку priceTypeбуде потрібно окреме, загальне визначення ; це неможливо зробити за допомогою лише локальних визначень типу.

Як обмежити вміст елемента, коли елемент має атрибут

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

  <xs:simpleType name="priceType">  
    <xs:restriction base="xs:decimal">  
      <xs:minInclusive value="0.00"/>  
      <xs:maxInclusive value="99999.99"/>  
    </xs:restriction>  
  </xs:simpleType>

  <xs:element name="price">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="priceType">
          <xs:attribute name="currency">
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:enumeration value="pounds" />
                <xs:enumeration value="euros" />
                <xs:enumeration value="dollars" />
              </xs:restriction>
            </xs:simpleType>
          </xs:attribute>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
</xs:schema>

8

вам потрібно створити тип і створити атрибут цього типу:

<xs:simpleType name="curr">
  <xs:restriction base="xs:string">
    <xs:enumeration value="pounds" />
    <xs:enumeration value="euros" />
    <xs:enumeration value="dollars" />
  </xs:restriction>
</xs:simpleType>

тоді:

<xs:complexType>
    <xs:attribute name="currency" type="curr"/>
</xs:complexType>

Привіт, на жаль, це не дозволяє мені одночасно обмежувати тип Ціни та перелік обмежень на атрибут "валюта"
Лука

-2
<xs:element name="price" type="decimal">
<xs:attribute name="currency" type="xs:string" value="(euros|pounds|dollars)" /> 
</element> 

Це повністю усуне потребу в переліку. Ви можете змінити тип на подвійний, якщо потрібно.


@valueне може відображатися на xs:attribute. xs:attributeне може з'являтися як дитина xs:element. Необхідні xs:префікси простору імен опущені. Ця відповідь є безладною і її слід просто видалити.
kjhughes
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.