Регулярное выражение в утверждении xsd ограничено началом значения элемента - PullRequest
0 голосов
/ 26 сентября 2019

Я создал утверждения в схеме xsd 1.1, которые содержат регулярные выражения.Предполагается, что выражения исключают римские числа и числа, которые имеют точку и пробел после них, от начала значения элемента.Из того, что я прочитал, мне не нужно привязывать регулярное выражение в схеме xsd b / c, оно должно уже применяться к началу (возможно, я неправильно понял).Я не могу ограничить регулярные выражения началом.

XSD:

   <xs:element name="node123">
         <xs:simpleType>
                <xs:restriction base="xs:string">
                       <xs:assertion test="not(matches($value, '[\d].*\.\s.|[I].*\.\s.*|[V].*\.\s.*|[X].*\.\s.*|[L].*\.\s.*|[C].*\.\s.*'))"/>
                       <xs:assertion test="not(starts-with($value, '-'))"/>
                       <xs:assertion test="not(starts-with($value, '–'))"/>
                       <xs:assertion test="not(starts-with($value, '—'))"/>
                </xs:restriction>
         </xs:simpleType>
   </xs:element>

Ложные срабатывания:

Mismash of Fid.Р. Крим.Z

Отправлено CO D

Я не могу использовать начальные числа с числовыми выражениями b / c, которые вообще не работают.Однако когда я начинаю с других выражений, это не относится ко всему значению элемента.

Можно ли ограничить выражения только первыми словами или началом элемента?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Примечания:

  1. Регулярные выражения XSD в xsd:pattern фасетах неявно привязаны в начале (^) и конце ($).

  2. Регулярные выражения XPath, которые используются в xsd:assertion, не неявно привязаны.

Учитывая вышесказанное, регулярное выражение , предоставленное @ WiktorStribiżew (вместе с его советом попробовать добавить ^), является разумным приближением к вашей цели исключения строк, которые выглядят как арабские илиРимские номера:

  <xs:element name="node123">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:assertion test="not(matches($value, '^([-–—]|[0-9IVXLC]+\.\s)'))"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
0 голосов
/ 26 сентября 2019

Я бы прокомментировал, но еще не набрал очков репутации, чтобы комментировать.Но вы можете заставить свое регулярное выражение начинать, вместо этого:

'[\d] ...

Сделайте это:

'^\s*[\d] ..

"^" форсирует начало, а "\ s *"обрабатывает любое мошенническое пустое пространство.

...