Каков синтаксис для определения фасета maxLength в XML-схеме?
Я пытаюсь проверить схему XML с помощью нескольких инструментов, но не получаю согласованного сообщения, в зависимости от того, какой инструмент я использую. Следующий синтаксис, кажется, проблема:
<xs:element name="Name"
minOccurs="1"
type ="xs:string"
maxLength = "125"/>
XML-Spy вызывает ошибку, тогда как Notepad ++ (windows) и XML Copy Editor (Ubuntu) проверяют ее. Так что синтаксис правильный, или я должен использовать это:
<xs:element name="name">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minOccurs="1"/>
<xs:maxLength = "125"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
2 ответа
Вы спрашиваете: "Так ли мой синтаксис правильный [в примере 1] или я должен написать [пример 2]?"
Ни.
В первом примере вы используете необъявленный атрибут maxLength в элементе xs: element. (Атрибут minOccurs может или не может быть разрешен, в зависимости от контекста; как уже указывал Петру Гардеа, он недопустим в объявлениях элементов верхнего уровня.) Редакторы, которые не вызывают ошибки в этом, не выполняют полную работу проверки соответствия схеме XSD для схем (не говоря уже о полных ограничениях XSD). Если вам нужна надежная проверка документов схемы XSD, Xerces, Saxon, MSV или другая соответствующая реализация XSD - ваш друг.
Во втором примере minOccurs перестал быть атрибутом в объявлении элемента (которым он может быть в некоторых контекстах) и стал элементом (нет, неправильно) внутри ограничения xs: (нет, неправильно). Фасет maxLength правильно представлен как дочерний элемент элемента xs: ограничений, но элемент в вашем примере сформирован неправильно; похоже, он пытается использовать имя типа элемента в качестве имени атрибута. Если вы удалите ошибочный элемент minOccurs и исправите некорректно сформированный элемент maxLength, оставшееся синтаксически правильное объявление элемента верхнего уровня для Name:
<xs:element name="name">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value = "125"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
Вот как может выглядеть синтаксис:
<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" xmlns="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="SomeContainer">
<xs:complexType>
<xs:sequence>
<xs:element name="Name" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="125"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
- minOccurs идет только к элементам в модели содержимого. Это не ожидается для элементов глобального уровня.
- MinOccurs="1" является лишним.
1
это значение по умолчанию, поэтому вам не нужно его указывать. - maxLength - это ограничивающий аспект, связанный с простыми ограничениями типов.