#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.