Схема XML: элемент с атрибутами и текст с ограничениями - PullRequest
3 голосов
/ 27 октября 2011

Я новичок в XML Schema и пытаюсь решить (на мой взгляд) довольно простую проблему: я хочу сопоставить тег в форме

<foo bar="123">some text</foo>

т.е. тег с текстом и атрибутом. По сути, я знаю, как это можно сделать с помощью extension. Вроде довольно не интуитивно понятно, но работает. Это основная идиома:

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

Однако я также хочу наложить ограничения на текст и атрибуты! Текст не должен превышать определенной длины, а атрибут должен быть целым числом в определенном диапазоне. Как я могу этого достичь? Кажется, что я не могу использовать ограничения для текста, когда я использую расширение.

Ответы [ 2 ]

2 голосов
/ 27 октября 2011

Используйте <xs:restriction> вместо расширения. Вы можете объявить простые типы отдельно и ссылаться на них в других конструкциях.

РЕДАКТИРОВАТЬ: извинения за мое время. Пошел вчера на какое-то мероприятие, как всегда оказалось, что вы не можете попасть в пробки моей страны, и я опоздал до такой степени, что просто повернул назад, крича и ругаясь. Вместо этого я провел весь вечер напившись.

Но теперь я трезв, и даже в таком состоянии это лучшее, что мне удалось придумать:

<xs:element name="option">
    <xs:complexType>
        <xs:simpleContent>
            <xs:restriction base="optionType">
                <xs:maxLength value="10" />
            </xs:restriction>
        </xs:simpleContent>
    </xs:complexType>
</xs:element>

<xs:complexType name="optionType">
    <xs:simpleContent>
        <xs:extension base="xs:string">
            <xs:attribute name="value">
                <xs:simpleType>
                    <xs:restriction base="xs:integer">
                        <xs:minInclusive value="0" />
                        <xs:maxInclusive value="10" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:extension>
    </xs:simpleContent>
</xs:complexType>

О боже. Итак, очевидно, вы должны сделать ограничение расширения. Приведенное выше ограничит содержимое элемента option строкой максимальной длины 10, а атрибут value - целым числом в диапазоне [0, 10] включительно.

Да, это не слишком многословно ...

0 голосов
/ 27 января 2019

Я столкнулся с подобной проблемой, и я бы лучше определил 2 простых типа. Один для атрибута, другой для контента.

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

    <xs:simpleType name="restrictedLengthString">
        <xs:restriction base="xs:string">
            <xs:maxLength value="10"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="boundedInteger">
        <xs:restriction base="xs:integer">
            <xs:minInclusive value="0" />
            <xs:maxInclusive value="10" />
        </xs:restriction>
    </xs:simpleType>

    <xs:element name="foo">
        <xs:complexType>
            <xs:simpleContent> 
                <xs:extension base="restrictedLengthString">
                    <xs:attribute name="bar" type="boundedInteger"/>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>

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