Как написать правильный xsd для элементов с тем же именем, но с другим содержанием - PullRequest
0 голосов
/ 22 марта 2011

У нас возникли проблемы с написанием правильного (действительного) xsd: - XSD должен подтвердить на http://www.w3.org/2001/03/webdata/xsv - должна быть возможность добавить схему в коллекцию схем сервера SQL (тест CREATE XML SCHEMA COLLECTION AS '[xsd here]' - нам нужно, чтобы значения атрибута title были указаны в xsd

Это (кардинально упрощенная) структура XML:

1) Это была наша первая версия (которая, очевидно, недействительна): вы не можете иметь 2 элемента с именем 'input', которые отличаются .

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xsd:element name="test">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="input">
                    <xsd:complexType>
                        <xsd:attribute name="title" fixed="Pretty title" use="required"/>
                    </xsd:complexType>
                </xsd:element>
                <xsd:element name="input">
                    <xsd:complexType>
                        <xsd:attribute name="title" fixed="Different title" use="required"/>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>

2) вторая попытка:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xsd:element name="test" type="Test"/>
<xsd:complexType name="input1">
    <xsd:attribute name="title" fixed="Pretty title" use="required"/>
</xsd:complexType>
<xsd:complexType name="input2">
    <xsd:attribute name="title" fixed="Different title" use="required"/>
</xsd:complexType>
<xsd:complexType name="Test">
    <xsd:sequence>
        <xsd:element name="input" type="input1"/>
        <xsd:element name="input" type="input2"/>
    </xsd:sequence>
</xsd:complexType>

  • w3.org выдает то же сообщение об ошибке, что и раньше: недопустимая переопределение {None}: ввод
  • xmlspy сообщает нам, что это действительный xsd
  • Сервер SQL выдает ошибку: модель содержимого типа «Test» содержит два элемента с одинаковым именем «input» и ограничениями различных типов, nillability или value.

Было бы замечательно, если бы кто-нибудь дал нам некоторое представление об этом.

Мана.

ps: На самом деле, наши XML-структуры намного сложнее, чем пример. Мы создаем генератор веб-форм. Вот еще один (все еще простой) пример:

<?xml version="1.0" encoding="UTF-8"?>
<ZForm title="main title" attachment="attachment1" type="NM08">
<Part title="part title">
    <SubTitle code="I.1)" title="title 1"/>
    <ShortText title="short text title 1"/>
    <SubTitle code="I.2)" title="title 2" subtitle="subtitle 1"/>
    <SelectList type="select type" title="select title"/>
    <ShortText title="short text title 2"/>
    <MultiSelectList type="multiType2" title="multi select title"/>     
    <RadioButtonList type="yesNo" title="lala"/>
    <SubTitle code="I.3)" title="some other title" subtitle="what?"/>
    <MultiSelectList type="multiType2" title=""/>
</Part>
<Part title="second part title">
    <Repeater add="add a new repeater item" remove="remove last repeating part">
        <RepeatingPart>
            <SubTitle code="II.1)" title="tiiiiiitle"/>
            <ShortText/>
        </RepeatingPart>
    </Repeater>
</Part>
</ZForm>

1 Ответ

2 голосов
/ 22 марта 2011

Спецификация XSD определяет ограничение «Согласованные объявления элементов», в результате чего, когда два родственных элемента имеют одинаковое имя, они также должны иметь одинаковый тип.

Хорошо известно, что XMLSpy не применяет некоторые изболее неловкие правила в спецификации.Я не знаю, было ли это потому, что они не удосужились написать код, или они чувствовали, что их версия была улучшением, но это всегда хорошая идея, чтобы проверить вашу схему, используя инструмент, чей подход к соответствию немногоболее строгий (Xerces на самом деле сильнее, чем сервис W3C MSV).

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