2014-09-25 5 views
2

У меня есть атрибут, который может быть любой строкой, но если он имеет начальные и конечные скобки "^[.*]$" - он должен быть только один из следующих конкретных значений:XSD: SimpleType: Как ограничить атрибут конкретных значений и регулярное выражение значения

"[EVENT]" 

и

"[PROTOCOL]" 

Так, "[EVENT]", "[PROTOCOL]", "SomeString" - это правильно, но "[SomeString]" - нет.

Как я могу это достичь?

+0

Если '[SomeString' без закрывающей скобки действительны? – kjhughes

+0

Собственно, нет. Он не должен быть действительным. – lyres

+0

И, я предполагаю, что 'SomeString '' без открытой скобки также должен быть недействительным, верно? [Мой ответ ниже] (http://stackoverflow.com/a/26049756/290085) принимает и отклоняет случаи, перечисленные в вашем вопросе, плюс отклоняет '' [SomeString "и' SomeString] "'. – kjhughes

ответ

2

Мне нравится @ Использование Burkart отдельных элементов xs:pattern лучше (+1), но я ожидал, что это ожидание в пояснениях в комментариях ("[SomeString" без закрывающей скобки должно быть недействительным), поэтому я буду публиковать его в любом случае на всякий случай может оказаться полезным. Прочтите регулярное выражение как EVENT или PROTOCOL в скобках или любой строке, которая не начинается или не заканчивается скобкой.

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="root"> 
    <xs:complexType> 
     <xs:attribute name="attr"> 
     <xs:simpleType> 
      <xs:restriction base="xs:string"> 
      <xs:pattern value="\[(EVENT|PROTOCOL)\]|[^\[].*[^\]]"/> 
      </xs:restriction> 
     </xs:simpleType> 
     </xs:attribute> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 
+0

Хорошая идея! Что касается более сложного случая: на самом деле у меня нет 2, но 10 "скобок" переменных ([СОБЫТИЯ], [ПРОТОКОЛ], [СЕССИЯ] и т. Д.) Допустимые случаи: 1. Любая строка без кронштейны 2. Названных 10 "квадратные скобки" переменные 3. Любые переменные в квадратных скобках (s) сцепляются с регулярными строками, например: My [EVENT] _for_ [ПРОТОКОЛ] @ google.com недействительных случаи: 1. Любой строка внутри кронштейнов, за исключением 10 предопределенных 2. То же с конкатенациями 3.Строки с только открывающим или закрывающим кронштейном Быть короткими - внутри кронштейнов могут быть только предопределенные переменные – lyres

+0

@lyes, я предлагаю вам задать новый вопрос. Благодарю. – kjhughes

+0

Спасибо, я разместил здесь новый вопрос: http://stackoverflow.com/questions/26059526/xsdsimpletype-how-to-restrict-attribute-to-list-of-specific-values-with-concat – lyres

3

Используйте xs:simpleType и регулярные выражения, чтобы ограничить базу xs:string. У вас может быть более одного xs:pattern, чтобы простые альтернативные шаблоны. Элемент должен соответствовать одному из шаблонов, или проверка не будет выполнена. Поскольку шаблоны являются регулярными выражениями, специальные символы, такие как «[» и «]», должны быть экранированы при использовании в качестве литералов.

XSD:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="root"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="elem" type="myElemType" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

    <xs:complexType name="myElemType"> 
    <xs:attribute name="attrib" type="myAttribType"/> 
    </xs:complexType> 

    <xs:simpleType name="myAttribType"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value="\[EVENT\]"/><!-- "[EVENT]": okay --> 
     <xs:pattern value="\[PROTOCOL\]"/><!-- "[PROTOCOL]": okay --> 
     <xs:pattern value="[^\[].*"/><!-- Starts with anything but "[": okay --> 
    </xs:restriction> 
    </xs:simpleType> 
</xs:schema> 

XML:

<root> 
    <elem attrib="[EVENT]"/> 
    <elem attrib="[PROTOCOL]"/> 
    <elem attrib="SomeString"/> 
    <elem attrib="SomeString]"/> 
    <elem attrib=" [SomeString] "/> 
    <!-- All the above are okay; the ones below fail validation --> 
    <elem attrib="[SomeString]"/> 
    <elem attrib="[SomeString"/> 
</root> 

Изменить регулярные выражения для содержания вашего сердца, например, провалить пример с ведущим и/или конечные пробелы.

Отредактировано, чтобы отразить комментарий ФП, что «[SomeString» также недействительна.

+0

Спасибо! Именно то, что я ищу. – lyres

+0

@lyres: Приятно помочь, и добро пожаловать в переполнение стека. Если этот ответ или любой другой решит вашу проблему, отметьте его как принятый, нажав зеленую галочку. – Burkart