Каков синтаксис для определения фасета 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 - это ограничивающий аспект, связанный с простыми ограничениями типов.
Другие вопросы по тегам