XSD для простого содержания с атрибутом и текстом - PullRequest
8 голосов
/ 28 марта 2011

Как я могу проверить длину текста элемента, который имеет атрибут.Например:

    <sport code="FB">Football</sport>

Теперь мне нужно ограничить возможные значения атрибута кода (например, «FB», «BB», «TT»), а также мне нужно ограничить возможные значения и длинутекст («Футбол», «Баскетбол», «Настольный теннис»), а также максимальная длина этого текста («Футбол», «Баскетбол», «Настольный теннис») может быть 20.

Я пытался с

<complexType name="sport">
  <simpleContent>
    <extension base="string">
        <attribute name="code" type="code" />
    </extension>
  </simpleContent>
</complexType>
<simpleType name="code">
    <restriction base="string">
        <enumeration value="FB" />
        <enumeration value="BB" />
        <enumeration value="TT" />
    </restriction>
</simpleType>

Но я не могу проверить длину текста "Foolball" (также возможные значения). Не могли бы вы помочь, как проверить и код, и текст.Спасибо

Ответы [ 4 ]

13 голосов
/ 15 июня 2012

У меня был такой же вопрос, и я надеялся, что нашел приемлемый ответ.Тем не менее, этот ответ именно то, что я пытался, но я получаю ошибку схемы неверно.Очевидно, вы не можете ограничить simpleContent в пределах complexType, только расширить его.Кроме того, вы не можете иметь как атрибут, так и simpleContent в пределах complexType.Ища примеры в книгах по всему офису, я нашел исправление, которое я адаптировал к этому вопросу на случай, если кто-то еще столкнется с этой проблемой в будущем:

1 голос
/ 22 ноября 2012

Мой элемент:

<xsd:element name="From" type="FromType" minOccurs="0" maxOccurs="1"/>

Не проверяет корректно значения перечисления принимают все.

<xsd:complexType name="FromType">
        <xsd:simpleContent>
            <xsd:extension base="FromTypeEnum">
                <xsd:attribute name="acronym" type="xsd:string"/>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>

    <xsd:simpleType name="FromTypeEnum">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="Discard">
                <xsd:annotation>
                    <xsd:documentation>Discard</xsd:documentation>
                </xsd:annotation>
            </xsd:enumeration>
            <xsd:enumeration value="SANDBOX">
                <xsd:annotation>
                    <xsd:documentation>SANDBOX</xsd:documentation>
                </xsd:annotation>
            </xsd:enumeration>
            <xsd:enumeration value="Catalogue">
                <xsd:annotation>
                    <xsd:documentation>Catalogue</xsd:documentation>
                </xsd:annotation>
            </xsd:enumeration>
            <xsd:enumeration value="Current experimentation">
                <xsd:annotation>
                    <xsd:documentation>Current experimentation</xsd:documentation>
                </xsd:annotation>
            </xsd:enumeration>
            <xsd:enumeration value="Current session">
                <xsd:annotation>
                    <xsd:documentation>Current session</xsd:documentation>
                </xsd:annotation>
            </xsd:enumeration>
            <xsd:enumeration value="Restart">
                <xsd:annotation>
                    <xsd:documentation>Restart</xsd:documentation>
                </xsd:annotation>
            </xsd:enumeration>
        </xsd:restriction>
    </xsd:simpleType>   
0 голосов
/ 18 февраля 2016

Решение вашей проблемы - создать simpleContent с extension, чей base ограничен одним способом, а чей attribute ограничен другим.

Эта XML-схема :

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

    <xs:complexType name="sportType">
        <xs:simpleContent>
            <xs:extension base="sportNameType">
                <xs:attribute name="code" type="sportCodeType" />
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:simpleType name="sportNameType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="Football" />
            <xs:enumeration value="Basketball" />
            <xs:maxLength value="20"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="sportCodeType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="FB" />
            <xs:enumeration value="BB" />
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

правильно проверяет требуемый документ экземпляра XML :

<?xml version="1.0" encoding="UTF-8"?>
<sport code="FB">Football</sport>

Примечание # 1: элемент maxLength соответствует одному из ваших требований,но на самом деле в этом нет необходимости, потому что перечислены спортивные имена.

Примечание № 2: Эта схема не обеспечивает корреляцию между именем спорта и спортивным кодом.Другими словами, эта схема также проверяет этот XML:

<?xml version="1.0" encoding="UTF-8"?>
<sport code="BB">Football</sport>

Чтобы это исправить, вам нужно будет использовать Schematron или XSD 1.1.

0 голосов
/ 28 марта 2011

Элемент должен быть сложного типа, где содержимое основано на строке и ограничено перечислением таким же образом, как и для атрибута.Кроме того, когда вы ограничиваете перечисление, это подразумевает максимальную длину.

В качестве примечания не используйте одинаковые имена для типов и элементов / атрибутов, так как это сбивает с толку.

РЕДАКТИРОВАТЬ:Добавлен полный пример:

<element name="sport" type="tns:SportType" />

<complexType name="SportType">
    <simpleContent>
        <restriction base="string">
            <enumeration value="Football" />
            <enumeration value="Basketball" />
        </restriction>
    </simpleContent>
    <attribute name="code" type="tns:CodeType" />
</complexType>

<simpleType name="CodeType">
    <restriction base="string">
        <enumeration value="FB" />
        <enumeration value="BB" />
    </restriction>
</simpleType>
...