В XSD как разрешить только пробелы в содержимом элемента? - PullRequest
0 голосов
/ 04 мая 2018

Я пишу XSD для элемента, который не имеет содержимого, только атрибуты, что кажется довольно простым:

  <xs:complexType name="ViewElement">
    <xs:attribute name="Name" type="xs:string" use="required"/>
  </xs:complexType>
  <xs:element name="VIEW" type="ViewElement" minOccurs="0" maxOccurs="unbounded"/>

Если XML содержит

<VIEW Name='V_UP'></VIEW>

или

<VIEW Name='V_UP'/>

работает нормально. Но если XML содержит

<VIEW Name='V_UP'>
</VIEW>

Я получаю

Элемент не может содержать пробелы. Модель содержимого пуста.

Я хочу предоставить авторам XML гибкость в написании XML таким способом, но я не могу понять, как разрешить контент, но только пробельный контент. Есть предложения?

Ответы [ 2 ]

0 голосов
/ 19 июля 2019

Мы нашли, что вложение двух пустых последовательностей xs: является более чистым решением:

  <xs:element name="a">
    <xs:complexType>
      <xs:sequence>  
        <xs:sequence />
      </xs:sequence>
      <xs:attribute name="test" type="xs:string" />
    </xs:complexType>
  </xs:element>

(протестировано с libxml)

0 голосов
/ 27 августа 2018

Вы можете использовать xsd:whiteSpace фасет с value="collapse" и требовать длину 0:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="OnlyWhiteSpaceElement">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:whiteSpace value="collapse"/>
        <xs:length value="0"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
</xs:schema>

Обновление 1: OP хотел бы добавить атрибуты к OnlyWhiteSpaceElement

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="OnlyWhiteSpaceElement">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="OnlyWhiteSpaceType">
          <xs:attribute name="Name" type="xs:string" use="required"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>

  <xs:simpleType name="OnlyWhiteSpaceType">
    <xs:restriction base="xs:string">
      <xs:whiteSpace value="collapse"/>
      <xs:length value="0"/>
    </xs:restriction> 
  </xs:simpleType> 
</xs:schema>

См. Также: Ограничить complexType атрибутами в XSD?


Обновление 2: OP хотел бы повторно использовать текущий анонимный сложный тип. Давайте определим именованный тип и проведем рефакторинг используемых имен ...

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="OnlyWhiteSpaceElement" type="OnlyWhiteSpaceType"/>

  <xs:complexType name="OnlyWhiteSpaceType">
    <xs:simpleContent>
      <xs:extension base="OnlyWhiteSpaceContentType">
        <xs:attribute name="Name" type="xs:string" use="required"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:simpleType name="OnlyWhiteSpaceContentType">
    <xs:restriction base="xs:string">
      <xs:whiteSpace value="collapse"/>
      <xs:length value="0"/>
    </xs:restriction> 
  </xs:simpleType> 
</xs:schema>

Обновление 3: Помните о различиях в реализации XSD-процессора относительно xs:whiteSpace value="collapse".

...