XSD ограничение, которое отрицает совпадающую строку - PullRequest
0 голосов
/ 27 марта 2012

Я хочу, чтобы мой XSD проверил содержимое строки.Чтобы быть конкретным, я хочу проверить , что определенная строка не встречается .

Рассмотрим это правило, которое проверит, что моя строка встречается.Поиск всех элементов Link начинается с этой конкретной строки: /site/example.com

<xs:element name="Link" type="xs:normalizedString" minOccurs="0">
  <xs:simpleType>
    <xs:restriction base="xs:token">
      <xs:pattern value="(/site/example\.com).*"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>                 

Другими словами, приведенное выше выражение проверяет, что все элементы Link начинаются с /site/example.com.Как инвертировать приведенное выше выражение, чтобы оно ** проверяло, что никакие элементы Link не начинаются с /site/example.com?

Я попробовал следующее регулярное выражение без удачи: /[^(site/example\.com)].*, так что это не работает:

Неработающая стратегия 1 (отрицание одного символа) Мне известно, что это, вероятно, будет работать для отрицания одного символа, так как этот вопрос SO: Шаблон ограничения схемы XML для запрета пустых строк

Предлагаемый шаблон вэтот вопрос <xs:pattern value=".*[^\s].*" />

Но отрицание только одного символа в этом случае не работает, так как оно будет некорректно:

/ site / example.com

, но также он может ошибочно завершитьсявопрос ( Регулярное выражение для соответствия строке, которая не содержит слова? ), вы можете решить эту проблему с отрицательным прогнозом (?!expr).

Так что это будет работать в обычном регулярном выражении:

^ ((?! / Site / example.com).) * $

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

Это в значительной степени описывает то, что я пробовал до сих пор.

Мой вопросКак я могу отрицать регулярное выражение в схеме XSD?

Ответы [ 2 ]

2 голосов
/ 13 сентября 2012

Это проще сделать в XSD 1.1, где вы можете использовать утверждения, чтобы гарантировать, что значение не начинается с указанной вами строки. Но концептуально это достаточно просто даже в XSD 1.0 и простых регулярных выражениях: вы хотите, чтобы строка не начиналась с "/site/example.com". Если бы это началось таким образом, у вас было бы логическое соединение ряда фактов о строке:

  • подстрока (., 1, 1) = '/'
  • подстрока (., 2, 1) = 's'
  • подстрока (., 3, 1) = 'i'
  • ...
  • подстрока (. 17, 1) = 'm'

Вы хотите отрицать это сочетание фактов. Теперь, согласно законам де Моргана, ~ (a и b и ... и z) эквивалентны (~ a или ~ b или ... или ~ z). Таким образом, вы можете сделать то, что вам нужно, написав дизъюнкцию следующих терминов:

    [^/].*
    |.([^s].*)?
    |.{2}([^i].*)?
    |.{3}([^t].*)?
    |.{4}([^e].*)?
    |.{5}([^/].*)?
    |.{6}([^e].*)?
    |.{7}([^x].*)?
    |.{8}([^a].*)?
    |.{9}([^m].*)?
    |.{10}([^p].*)?
    |.{11}([^l].*)?
    |.{12}([^e].*)?
    |.{13}([^\.].*)?
    |.{14}([^c].*)?
    |.{15}([^o].*)?
    |.{16}([^m].*)?

В каждом вышеприведенном термине подвыражение формы [^s].* заключено в (...)? - термин .{2}([^i].*)? означает, что любая строка, начинающаяся с двух символов, в порядке, если третий символ не является i или если третьего персонажа нет вообще. Это гарантирует, что строки длиной менее 17 символов не исключаются, даже если они являются префиксами запрещенной строки.

Конечно, чтобы использовать это в документе схемы XSD, вам нужно будет удалить все пробелы, что затруднит чтение регулярного выражения.

[Дополнение, июнь 2016 г.] См. Также этот связанный и более общий вопрос .

1 голос
/ 28 марта 2012

Вы не упоминаете, привязаны ли вы к XML Schema 1.0 и XPath 1.0, но если нет, то можно достичь своей цели с помощью xs: assert, в соответствии с этим (что может потребовать некоторой работы - это изпамять ...):

<xs:element name="Link" type="xs:normalizedString" minOccurs="0">
  <xs:simpleType>
    <xs:restriction base="xs:token">
      <xs:assert test="not( fn:starts-with( $value , '/site/example.com' ) )" />
    </xs:restriction>
  </xs:simpleType>
</xs:element>  

Некоторые ссылки, представляющие интерес:

http://www.ibm.com/developerworks/library/x-xml11pt2/

http://www.w3.org/TR/xpath-functions/#func-starts-with

Приветствия,

...