XSD Pattern Restriction - Чередование с косой чертой - PullRequest
2 голосов
/ 09 мая 2019

Мне нужно создать XSD-файл. Мой сложный тип содержит SimplyType с базовым значением xs: string, и я хотел бы дать ему следующее ограничение шаблона:

[X|X/R|X/L]

Поэтому я намерен разрешить либо X, X/R, либо X/L.

При попытке проверить xml по этой схеме XMLSpy сообщает мне, что разрешены только X, R, L или /. Но не ожидаемая комбинация.

Что я делаю не так. Согласно моим исследованиям / не требуется экранирующий символ.

Большое спасибо

1 Ответ

2 голосов
/ 09 мая 2019

Причиной сбоя вашего шаблона является то, что при использовании Классы символов или Наборы символов ([ ]) вы указываете, что любой из перечисленных символов является приемлемым, а не тем, что вы хотите.

Вы правы в отношении прямой косой черты: это не особый метасимвол регулярного выражения в любой разновидности регулярного выражения, просто иногда он используется как разделитель регулярных выражений в разновидностях, которые допускают регулярное выражение литеральных нотаций (например,/^abc$/).

Итак, все, что вам нужно использовать, это

<xs:pattern value="X|X/R|X/L"/>

или менее многословно с [RL] (класс символов соответствует R или L) вместоповторения двух последних значений:

<xs:pattern value="X|X/[RL]"/>

Или даже

<xs:pattern value="X(/[RL])?"/>

Здесь X сопоставляется, затем /R или /L сопоставляются 1 или 0 раз,т. е. по желанию.

XSD-шаблоны всегда привязываются по умолчанию (= должно соответствовать всей строке), поэтому не следует добавлять ^ или $ в начале / конце.


Вот полный пример поддержки XSD:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" > 
  <xsd:element name="r">
    <xsd:simpleType>
      <xsd:restriction base="xsd:string"> 
        <xsd:pattern value="X|X/R|X/L"/> 
      </xsd:restriction>
    </xsd:simpleType>
  </xsd:element>
</xsd:schema>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...