namespace sieve = "urn:ietf:params:xml:ns:sieve" start = element sieve:sieve { ( control | action | displayblock | displaydata | comment | ext )* } comment = element sieve:comment { xsd:string } ambles = ( ( displaydata | comment | ext )* ), empty preamble = element sieve:preamble { ambles } postamble = element sieve:postamble { ambles } command = ( attribute name { xsd:token { pattern = "[A-Za-z_][A-Za-z0-9_]*" } }, preamble?, ( str | num | \list | tag )*, test?, ( control | action | displayblock)*, postamble? ), empty control = element sieve:control { command } action = element sieve:action { command } test = element sieve:test { attribute name { xsd:token { pattern = "[A-Za-z_][A-Za-z0-9_]*" } }, ( str | num | \list | tag | comment | ext )*, test* } \list = element sieve:list { str+ } tag = element sieve:tag { xsd:token { pattern = "[A-Za-z_][A-Za-z0-9_]*" } } str = element sieve:str { xsd:string } num = element sieve:num { xsd:nonNegativeInteger } any = ( element * { any } | attribute * { text } | text )* ext = element * - sieve:* { any }* displayblock = element sieve:displayblock { ( control | action | displayblock | displaydata | comment | ext )*, attribute * { text }* } displaydata = element sieve:displaydata { any* }