Регулярное выражение в утверждении xsd ограничено началом значения элемента

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

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>

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

Мимаш Фида. Р. Крим. Z

Отправлено C.O.D

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

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


person Halle    schedule 26.09.2019    source источник
comment
Попробуйте один xs:assertion с test="not(matches($value, '([-–—]|[0-9IVXLC]+\.\s).*'))". Если оно не ведет себя как обычное регулярное выражение XSD, попробуйте добавить ^ в начале.   -  person Wiktor Stribiżew    schedule 26.09.2019
comment
Благодарю вас! Это сработало и намного чище, чем то, что я придумал целую вечность.   -  person Halle    schedule 30.09.2019
comment
Не понял, что регулярное выражение на самом деле не работает. Так что нет смысла держать ответ с объяснением регулярного выражения.   -  person Wiktor Stribiżew    schedule 30.09.2019
comment
Привет, Виктор, регулярное выражение, которое вы включили, работало с добавлением ^ для утверждения. У меня просто недостаточно очков репутации, чтобы указать, что это было полезно.   -  person Halle    schedule 03.10.2019


Ответы (2)


Заметки:

  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>
person kjhughes    schedule 26.09.2019
comment
Спасибо. Я не понимал, что регулярные выражения xpath не были неявно привязаны к xsd:assertion. Я приму это к сведению на будущее. - person Halle; 30.09.2019

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

'[\d] ...

Сделай это:

'^\s*[\d] ..

«^» задает начало, а «\s*» обрабатывает любые недопустимые пробелы.

person NybbleStar    schedule 26.09.2019