Ограничить список слов в схеме XML - PullRequest
5 голосов
/ 01 мая 2009

Я пишу схему XML, и мне нужно, чтобы текст элемента не совпадал с определенными значениями. (Например, элемент variableName не может соответствовать 'int', 'byte', 'string' и т. Д.)

Я попытался использовать ограничение с элементом шаблона, похожим на «^ (int | byte | string)», но безуспешно.

Знаете ли вы способ форматирования регулярного выражения или любой другой способ заставить это работать?

Ответы [ 3 ]

6 голосов
/ 04 мая 2009

После тройной проверки, что регулярные выражения XML Schema (XSD) на самом деле не поддерживают никаких функций, которые могли бы облегчить эту задачу (в частности, предпросмотры и привязки), я предложил это похоже на работу. Я использовал режим свободного пробела, чтобы его было легче читать, но это еще одна функция, не поддерживаемая XSD.

  [^ibs].* |
  i(.{0,1} | [^n].* | n[^t].* | nt.+) |
  b(.{0,2} | [^y].* | y[^t].* | yt[^e].* | yte.+) |
  s(.{0,4} | [^t].* | t[^r].* | tr[^i].* | tri[^n].* | trin[^g].* | tring.+)

Первая альтернатива соответствует всему, что не начинается с начальной буквы любого из ключевых слов. Каждая из других альтернатив верхнего уровня соответствует строке, которая начинается с той же буквы, что и одно из ключевых слов, но:

  • короче, чем ключевое слово,
  • имеет другую вторую букву, другую третью букву и т. Д., Или
  • длиннее ключевого слова.

Обратите внимание, что регулярные выражения XSD не поддерживают явные привязки (т. Е. ^, $, \A, \z), но все совпадения неявно привязываются с обоих концов.

Одна потенциальная проблема, которую я вижу: если список ключевых слов длинный, вы можете столкнуться с ограничением длины регулярного выражения.

1 голос
/ 03 мая 2009

Должна ли это быть схема W3C (она же "XML-схема")? Или стандартная альтернатива, такая как RelaxNG , будет работать? Возможно, я ошибаюсь, но я подумал, что у него есть несколько препятствий на пути объединения ограничений, в том числе возможность делать пересечения.

0 голосов
/ 02 мая 2009

Без негативного взгляда это довольно утомительно. Прилагается регулярное выражение, которое работает с некоторыми модульными тестами. Это написано на Perl, а не на XSD, но это довольно простое регулярное выражение, поэтому оно должно работать ... Вы должны удалить пробел из регулярного выражения перед использованием Я добавил пробел, чтобы его было легче читать.

Примечание: я не знаю, разрешены ли "\ A" и "\ z" в XSD. Если нет, замените на «^» и «$» соответственно.

use Test::More 'no_plan';

my $re = qr/\A(\z|[^ibs]                                                        
   |i(\z|[^n]|n(\z|[^t]|t.))                                                    
   |b(\z|[^y]|y(\z|[^t]|t(\z|[^e]|e.)))                                         
   |s(\z|[^t]|t(\z|[^r]|r(\z|[^i]|i(\z|[^n]|n(\z|[^g]|g.))))))/x;

for my $str ( qw(inter bytes ins str strings in sdgsdfger i b s by byt bite st \
str stri strin strink) ) {
   like($str, $re, $str);
}

for my $str ( qw(int byte string) ) {
   unlike($str, $re, $str);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...