XSD — Список со всеми фиксированными значениями

#xml #xsd #xmlschema

Вопрос:

Каким было бы правильное объявление схемы XML для:

 ...<answersList>
    <question quest="Name?" cod="n_name">Variable Content</question>
    <question quest="Weight?" cod="n_weight">Variable Content</question>
</answersList>...
 

Каждое значение для обоих атрибутов должно быть в перечислении XSD.

До сих пор я пытался: (Это не работает)

         <xs:element name="question">
            <xs:complexType>
              <xs:attribute name="quest">
                <xs:restriction base="xs:string">
                    <xs:enumeration value="Name?"/>
                    <xs:enumeration value="Weight?"/>
                </xs:restriction>
            </xs:attribute>
            <xs:attribute name="cod">
                <xs:restriction base="xs:string">
                    <xs:enumeration value="n_name"/>
                    <xs:enumeration value="n_weight"/>
                </xs:restriction>
            </xs:attribute>
          </xs:complexType>
        </xs:element>
 

Использование этого веб-сайта для тестирования:
https://www.freeformatter.com/xml-validator-xsd.html

Комментарии:

1. Либо определите фиксированное значение, либо определите фасет перечисления только с одним значением в списке.

2. @MichaelKay Я не вижу, как сделать фиксированные значения для списка. Я пытаюсь сделать это с помощью перечисления, но у меня ничего не получается :/

3. И я боюсь, что просто не понимаю вашего вопроса. Я не вижу никаких списков в ваших данных, и я не понимаю, почему вы хотите, чтобы quest имел фиксированное значение, когда у вашего экземпляра есть два атрибута quest с разными значениями. Я подозреваю, что вы используете термины «список» и «фиксированное значение» в смысле, совершенно отличном от их фактического значения в спецификации XSD, что не способствует общению.

4. @MichaelKay Да, вы совершенно правы. Я даже не понимал, чего хочу. Я пытаюсь получить перечисление для 2 атрибутов для вопроса о теге.

5. В примере идея заключается в том, что тег «quest» должен проверять только то, содержит ли он «Имя?» или вес?. И тег «cod» должен проверяться только в том случае, если он содержит: «n_name» или «n_weight».

Ответ №1:

В XML-схеме имя тега определяет его тип, а тип описывает разрешенное содержимое. Когда тег повторяется, каждое вхождение имеет один и тот же тип.

Таким образом, вы не можете применить один набор правил к атрибутам in //answersList/question[1] и другой набор правил к атрибутам in //answersList/question[2] .

Комментарии:

1. Идея, которую я имею, состоит в том, чтобы применять одни и те же правила для всех вопросов, но разные правила в атрибуте[1.1] и атрибуте[1.2]. У вас есть какие-либо идеи о том, как заставить концепцию xsd, которую я сделал, работать и подтверждать? Я пробыл около 12 часов и до сих пор не смог «скомпилировать» его, спасибо за ответ!

2. Мне непонятно (во всяком случае, мне), что вы пытаетесь сделать. Ваш фрагмент XSD явно недействителен, потому что у вас нет определения простого типа для атрибутов. Помогает ли это вообще?

3. Да, мой XSD недействителен. Я пытаюсь заставить оба атрибута иметь перечисление того, что они могут хранить, и того, что они не могут. В примере идея заключается в том, что поиск тегов должен проверять только то, содержит ли он «Имя?» или вес?. И тег cod должен проверяться только в том случае, если он содержит: «n_name» или «n_weight».

Ответ №2:

Мне кажется, что на самом деле вы ищете ограничения между узлами: «если X-это A, то Y должно быть B». Это может быть достигнуто с помощью утверждений в XSD 1.1; это не может быть достигнуто в XSD 1.0.

Вы можете ограничить каждый из атрибутов фиксированным набором значений, используя тип перечисления (простой тип, определенный путем ограничения xs:string аспектом перечисления), и вы можете определить ограничения между атрибутами с помощью утверждений, при условии, что вы используете процессор XSD 1.1.