XmlSchema Свертывание пробелов: что происходит с несколькими пробелами?

Я использую следующую XmlSchema:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  targetNamespace="http://www.test.com/XmlValidation"
  elementFormDefault="qualified"
  attributeFormDefault="unqualified"
  xmlns:m="http://www.test.com/XmlValidation">

  <xs:element name="test">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="testElement" type="m:requiredStringType"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:simpleType name="requiredStringType">
    <xs:restriction base="xs:string">
      <xs:minLength value="1"/>
      <xs:whiteSpace value="collapse"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>

Он определяет обязательный тип StringType, длина которого должна быть не менее одного символа, а также определяет свертывание пробелов.

Когда я проверяю следующий документ Xml, проверка проходит успешно:

<?xml version="1.0" encoding="UTF-8"?>
<test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.text.com/XmlValidation">
    <testElement>     </testElement>
</test>

w3.org определяет свертывание пробелов:

«После обработки, подразумеваемой заменой, непрерывные последовательности #x20 сворачиваются в один #x20, а начальные и конечные #x20 удаляются».

Означает ли это, что 3 пробела свернуты в один или в ноль пробелов? В XmlSpy проверка не проходит, в .Net — успешно.


person crauscher    schedule 20.03.2009    source источник


Ответы (2)


Поскольку в нем говорится, что начальные и конечные пробелы удаляются, это означает, что строка, содержащая только пробелы, будет свернута в пустую строку. XmlSpy точен в проверке, а .NET великодушен (или делает ошибку).

Это соответствует нормализации пробелов во время проверки из Схема XML, часть 1: Структуры, второе издание.

сохранить
Нормализация не выполняется, значение является ·нормализованным значением·
заменить
Все вхождения #x9 (вкладка), #xA ( перевод строки) и #xD (возврат каретки) заменяются > на #x20 (пробел).
свернуть
После замен, указанных выше в разделе замены, непрерывные последовательности #x20 сворачиваются. до одного #x20, а начальные и/или конечные #x20 удаляются.

Таким образом, сначала все пробелы заменяются пробелами, во-вторых, непрерывные последовательности заменяются одним пробелом, третьи и последние, начальные и конечные пробелы удаляются. Следуя этой последовательности, строка, содержащая только пробелы, должна быть нормализована до пустой строки во время проверки.

person Eddie    schedule 20.03.2009
comment
Я не уверен, обрабатывается ли оставшийся пробел (тот, что после коллапса) как ведущий пробел. Возможно, поведение .Net правильное. Я не нашел XmlValidator на сайте w3.org, который мог бы доказать мою неправоту. - person crauscher; 20.03.2009

Кажется, это работает для .Net (обратите внимание на аспект шаблона), шаблон не требуется в Saxon.

<xs:element name="StoreCode" minOccurs="1">
<xs:simpleType>                         
    <xs:restriction base="xs:string">
            <xs:whiteSpace value="collapse"/>
        <xs:pattern value=""/>
        <xs:minLength value="1"/>
        <xs:maxLength value="15"/>
    </xs:restriction>
</xs:simpleType>
</xs:element>
person user4371159    schedule 17.12.2014