// Copyright (c) 2008-2010 by Kavanagh Consultancy Limited. All rights reserved. // This pattern file defines the syntax rules and lexical structure of // <a href="http://www.w3.org/TR/2006/REC-xml-20060816">Extensible Markup Language (XML) 1.0 (Fourth Edition)</a> // including errata as of 18 January 2008 (from proposed Fifth Edition) ExtensibleMarkupLanguage : // Syntax Rules extensibleMarkup := document // Document // [1] document ::= prolog element Misc* document := prolog element { Misc }* // Character Range // [2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] // /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */ // (Lexical Rules) // Char := '\t' | '\n' | '\r' | 0x20..0xD7FF | 0xE000..0xFFFD | 0x10000..0x10FFFF // White Space // [3] S ::= (#x20 | #x9 | #xD | #xA)+ // (Lexical Rules) // S ::= { ' ' | '\t' | '\r' | '\n' }+ // Names and Tokens // [4] NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] // | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] // | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF] // [4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040] // [5] Name ::= NameStartChar (NameChar)* // [6] Names ::= Name (#x20 Name)* // [7] Nmtoken ::= (NameChar)+ // [8] Nmtokens ::= Nmtoken (#x20 Nmtoken)* // (Lexical Rules) // NameStartChar := ':' | 'A'..'Z' | '_' | 'a'..'z' | 0xC0..0xD6 | 0xD8..0xF6 | 0xF8..0x2FF | 0x370..0x37D // | 0x37F..0x1FFF | 0x200C..0x200D | 0x2070..0x218F | 0x2C00..0x2FEF // | 0x3001..0xD7FF | 0xF900..0xFDCF | 0xFDF0..0xFFFD | 0x10000..0xEFFFF // NameChar := NameStartChar | '-' | '.' | '0'..'9' | 0xB7 | 0x0300..0x036F | 0x203F..0x2040 // Name ::= NameStartChar { NameChar }* // Names ::= Name { ' ' Name }* // Nmtoken ::= { NameChar }+ // Nmtokens ::= Nmtoken { ' ' Nmtoken }* // Literals // [9] EntityValue ::= '"' ([^%&"] | PEReference | Reference)* '"' // | "'" ([^%&'] | PEReference | Reference)* "'" // [10] AttValue ::= '"' ([^<&"] | Reference)* '"' // | "'" ([^<&'] | Reference)* "'" // [11] SystemLiteral ::= ('"' [^"]* '"') | ("'" [^']* "'") // [12] PubidLiteral ::= '"' PubidChar* '"' | "'" (PubidChar - "'")* "'" // [13] PubidChar ::= #x20 | #xD | #xA | [a-zA-Z0-9] | [-'()+,./:=?;!*#@$_%] // (Lexical Rules) // EntityValue ::= '"' { ! '%' ! '&' ! '"' Char | PEReference | Reference }* '"' // | "'" { ! '%' ! '&' ! "'" Char | PEReference | Reference }* "'" // AttValue := AttValueQuot_ { AttValueQuotData_ | Reference }* AttValueQuot_ // | AttValueApos_ { AttValueAposData_ | Reference }* AttValueApos_ // AttValueQuot_ ::= '"' // AttValueQuotData_ ::= { ! '<' ! '&' ! '"' Char }+ // AttValueApos_ ::= "'" // AttValueAposData_ ::= { ! '<' ! '&' ! "'" Char }+ // SystemLiteral ::= '"' { ! '"' Char }* '"' | "'" { ! "'" Char }* "'" // PubidLiteral ::= '"' { PubidChar }* '"' | "'" { ! "'" PubidChar }* "'" // PubidChar := ' ' | '\r' | '\n' | 'a'..'z' | 'A'..'Z' | '0'..'9' | '-' | "'" | '(' | ')' | '+' // | ',' | '.' | '/' | ':' | '=' | '?' | ';' | '!' | '*' | '#' | '@' | '$' | '_' | '%' // Character Data // [14] CharData ::= [^<&]* - ([^<&]* ']]>' [^<&]*) // (Lexical Rules) // CharData ::= { ! '<' ! '&' ! SectEnd_ Char }* // Comments // [15] Comment ::= '<!--' ((Char - '-') | ('-' (Char - '-')))* '-->' // (Lexical Rules) // Comment ::= "<!--" { ! "--" Char }* "-->" // Processing Instructions // [16] PI ::= '<?' PITarget (S (Char* - (Char* '?>' Char*)))? '?>' // [17] PITarget ::= Name - (('X' | 'x') ('M' | 'm') ('L' | 'l')) // (Lexical Rules since we need to parse PIData_ as a token) // PI := PIStart_ PITarget [ S PIData_ ] PIEnd_ // PITarget := ! ( ( 'X' | 'x' ) ( 'M' | 'm' ) ( 'L' | 'l' ) ! NameChar ) Name // PIData_ ::= { ! PIEnd_ Char }* // CDATA Sections // [18] CDSect ::= CDStart CData CDEnd // [19] CDStart ::= '<![CDATA[' // [20] CData ::= (Char* - (Char* ']]>' Char*)) // [21] CDEnd ::= ']]>' // (Lexical Rules since we need to parse CData as a token) // CDSect := CDStart CData CDEnd // CDStart := SectStart_ CDATA_ SectBegin_ // CData ::= { ! SectEnd_ Char }* // CDEnd := SectEnd_ // Prolog // [22] prolog ::= XMLDecl? Misc* (doctypedecl Misc*)? // [23] XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>' // [24] VersionInfo ::= S 'version' Eq ("'" VersionNum "'" | '"' VersionNum '"') // [25] Eq ::= S? '=' S? // [26] VersionNum ::= '1.' [0-9]+ // [27] Misc ::= Comment | PI | S prolog := [ XMLDecl ] { Misc }* [ doctypedecl { Misc }* ] XMLDecl := "<?" xml_ VersionInfo [ EncodingDecl ] [ SDDecl ] [ S ] "?>" VersionInfo := [ S ] version_ Eq VersionLiteral_ Misc := Comment | PI | S // (Lexical Rules) // Eq := [ S ] EqOperator_ [ S ] // VersionLiteral_ ::= "'" VersionNum "'" | '"' VersionNum '"' // VersionNum := "1." { '0'..'9' }+ // Document Type Definition // [28] doctypedecl ::= '<!DOCTYPE' S Name (S ExternalID)? S? // ('[' intSubset ']' S?)? '>' [VC: Root Element Type] // [WFC: External Subset] // [28a] DeclSep ::= PEReference | S [WFC: PE Between Declarations] // [28b] intSubset ::= (markupdecl | DeclSep)* // [29] markupdecl ::= elementdecl | AttlistDecl | EntityDecl // | NotationDecl | PI | Comment [VC: Proper Declaration/PE Nesting] // [WFC: PEs in Internal Subset] doctypedecl := "<!" DOCTYPE_ S Name [ S ExternalID ] [ S ] [ '[' intSubset ']' [ S ] ] '>' DeclSep := PEReference | S intSubset := { markupdecl | DeclSep }* markupdecl := elementdecl | AttlistDecl | EntityDecl | NotationDecl | PI | Comment // External Subset // [30] extSubset ::= TextDecl? extSubsetDecl // [31] extSubsetDecl ::= (markupdecl | conditionalSect | DeclSep)* extSubset := [ TextDecl ] extSubsetDecl extSubsetDecl := { markupdecl | conditionalSect | DeclSep }* // Standalone Document Declaration // [32] SDDecl ::= S 'standalone' Eq (("'" ('yes' | 'no') "'") // | ('"' ('yes' | 'no') '"')) [VC: Standalone Document Declaration] SDDecl := S standalone_ Eq StandaloneLiteral_ // (Lexical Rules) // StandaloneLiteral_ ::= "'" ( "yes" | "no" ) "'" | '"' ( "yes" | "no" ) '"' // (Productions 33 through 38 have been removed.) // Element // [39] element ::= EmptyElemTag // | STag content ETag [WFC: Element Type Match] // [VC: Element Valid] // (Lexical Rules since we need to parse CharData as a token) // element := EmptyElemTag | STag content ETag // Start-tag // [40] STag ::= '<' Name (S Attribute)* S? '>' [WFC: Unique Att Spec] // [41] Attribute ::= Name Eq AttValue [VC: Attribute Value Type] // [WFC: No External Entity References] // [WFC: No < in Attribute Values] // (Lexical Rules since we need to parse CharData as a token) // STag := TagStart_ Name { S Attribute }* [ S ] TagEnd_ // Attribute := Name Eq AttValue // End-tag // [42] ETag ::= '</' Name S? '>' // (Lexical Rules since we need to parse CharData as a token) // ETag := ETagStart_ Name [ S ] TagEnd_ // Content of Elements // [43] content ::= CharData? ((element | Reference | CDSect | PI | Comment) CharData?)* // (Lexical Rules since we need to parse CharData as a token) // content := [ CharData ] { ( element | Reference | CDSect | PI | Comment ) [ CharData ] }* // Tags for Empty Elements // [44] EmptyElemTag ::= '<' Name (S Attribute)* S? '/>' [WFC: Unique Att Spec] // (Lexical Rules since we need to parse CharData as a token) // EmptyElemTag := TagStart_ Name { S Attribute }* [ S ] EmptyElemTagEnd_ // Element Type Declaration // [45] elementdecl ::= '<!ELEMENT' S Name S contentspec S? '>' [VC: Unique Element Type Declaration] // [46] contentspec ::= 'EMPTY' | 'ANY' | Mixed | children elementdecl := "<!" ELEMENT_ S Name S contentspec [ S ] '>' contentspec := EMPTY_ | ANY_ | Mixed | children // Element-content Models // [47] children ::= (choice | seq) ('?' | '*' | '+')? // [48] cp ::= (Name | choice | seq) ('?' | '*' | '+')? // [49] choice ::= '(' S? cp ( S? '|' S? cp )+ S? ')' [VC: Proper Group/PE Nesting] // [50] seq ::= '(' S? cp ( S? ',' S? cp )* S? ')' [VC: Proper Group/PE Nesting] children := ( choice | seq ) [ '?' | '*' | '+' ] cp := ( Name | choice | seq ) [ '?' | '*' | '+' ] choice := '(' [ S ] cp [ S ] { '|' [ S ] cp [ S ] }+ ')' seq := '(' [ S ] cp [ S ] { ',' [ S ] cp [ S ] }* ')' // Mixed-content Declaration // [51] Mixed ::= '(' S? '#PCDATA' (S? '|' S? Name)* S? ')*' // | '(' S? '#PCDATA' S? ')' [VC: Proper Group/PE Nesting] // [VC: No Duplicate Types] Mixed := '(' [ S ] '#' PCDATA_ [ S ] ( ')' | { '|' [ S ] Name [ S ] }* ')' '*' ) // Attribute-list Declaration // [52] AttlistDecl ::= '<!ATTLIST' S Name AttDef* S? '>' // [53] AttDef ::= S Name S AttType S DefaultDecl AttlistDecl := "<!" ATTLIST_ S Name { AttDef }* [ S ] '>' AttDef := S Name S AttType S DefaultDecl // Attribute Types // [54] AttType ::= StringType | TokenizedType | EnumeratedType // [55] StringType ::= 'CDATA' // [56] TokenizedType ::= 'ID' [VC: ID] // [VC: One ID per Element Type] // [VC: ID Attribute Default] // | 'IDREF' [VC: IDREF] // | 'IDREFS' [VC: IDREF] // | 'ENTITY' [VC: Entity Name] // | 'ENTITIES' [VC: Entity Name] // | 'NMTOKEN' [VC: Name Token] // | 'NMTOKENS' [VC: Name Token] AttType := StringType | TokenizedType | EnumeratedType StringType := CDATA_ TokenizedType := ID_ | IDREF_ | IDREFS_ | ENTITY_ | ENTITIES_ | NMTOKEN_ | NMTOKENS_ // Enumerated Attribute Types // [57] EnumeratedType ::= NotationType | Enumeration // [58] NotationType ::= 'NOTATION' S '(' S? Name (S? '|' S? Name)* S? ')' [VC: Notation Attributes] // [VC: One Notation Per Element Type] // [VC: No Notation on Empty Element] // [VC: No Duplicate Tokens] // [59] Enumeration ::= '(' S? Nmtoken (S? '|' S? Nmtoken)* S? ')' [VC: Enumeration] // [VC: No Duplicate Tokens] EnumeratedType := NotationType | Enumeration NotationType := NOTATION_ S '(' [ S ] Name [ S ] { '|' [ S ] Name [ S ] }* ')' Enumeration := '(' [ S ] Nmtoken [ S ] { '|' [ S ] Nmtoken [ S ] }* ')' // Attribute Defaults // [60] DefaultDecl ::= '#REQUIRED' | '#IMPLIED' // | (('#FIXED' S)? AttValue) [VC: Required Attribute] // [VC: Attribute Default Value Syntactically Correct] // [WFC: No < in Attribute Values] // [VC: Fixed Attribute Default] // [WFC: No External Entity References] DefaultDecl := '#' REQUIRED_ | '#' IMPLIED_ | ( [ '#' FIXED_ S ] AttValue ) // Conditional Section // [61] conditionalSect ::= includeSect | ignoreSect // [62] includeSect ::= '<![' S? 'INCLUDE' S? '[' extSubsetDecl ']]>' [VC: Proper Conditional Section // /PE Nesting] // [63] ignoreSect ::= '<![' S? 'IGNORE' S? '[' ignoreSectContents* ']]>' [VC: Proper Conditional Section // /PE Nesting] // [64] ignoreSectContents ::= Ignore ('<![' ignoreSectContents ']]>' Ignore)* // [65] Ignore ::= Char* - (Char* ('<![' | ']]>') Char*) // (Lexical Rules since we need to parse Ignore as a token) // conditionalSect := includeSect | ignoreSect // includeSect := SectStart_ [ S ] INCLUDE_ [ S ] SectBegin_ extSubsetDecl SectEnd_ // ignoreSect := SectStart_ [ S ] IGNORE_ [ S ] SectBegin_ { ignoreSectContents }* SectEnd_ // ignoreSectContents := Ignore { SectStart_ ignoreSectContents SectEnd_ Ignore }* // Ignore ::= { ! SectStart_ ! SectEnd_ Char }* // Character Reference // [66] CharRef ::= '&#' [0-9]+ ';' // | '&#x' [0-9a-fA-F]+ ';' [WFC: Legal Character] // (Lexical Rules) // CharRef ::= "&#" { '0'..'9' }+ ';' | "&#x" { '0'..'9' | 'a'..'f' | 'A'..'F' }+ ';' // Entity Reference // [67] Reference ::= EntityRef | CharRef // [68] EntityRef ::= '&' Name ';' [WFC: Entity Declared] // [VC: Entity Declared] // [WFC: Parsed Entity] // [WFC: No Recursion] // [69] PEReference ::= '%' Name ';' [VC: Entity Declared] // [WFC: No Recursion] // [WFC: In DTD] // (Lexical Rules) // Reference := EntityRef | CharRef // EntityRef ::= '&' Name ';' // PEReference ::= '%' Name ';' // Entity Declaration // [70] EntityDecl ::= GEDecl | PEDecl // [71] GEDecl ::= '<!ENTITY' S Name S EntityDef S? '>' // [72] PEDecl ::= '<!ENTITY' S '%' S Name S PEDef S? '>' // [73] EntityDef ::= EntityValue | (ExternalID NDataDecl?) // [74] PEDef ::= EntityValue | ExternalID EntityDecl := GEDecl | PEDecl GEDecl := "<!" ENTITY_ S Name S EntityDef [ S ] '>' PEDecl := "<!" ENTITY_ S '%' S Name S PEDef [ S ] '>' EntityDef := EntityValue | ExternalID [ NDataDecl ] PEDef := EntityValue | ExternalID // External Entity Declaration // [75] ExternalID ::= 'SYSTEM' S SystemLiteral // | 'PUBLIC' S PubidLiteral S SystemLiteral // [76] NDataDecl ::= S 'NDATA' S Name [VC: Notation Declared] ExternalID := SYSTEM_ S SystemLiteral | PUBLIC_ S PubidLiteral S SystemLiteral NDataDecl := S NDATA_ S Name // Text Declaration // [77] TextDecl ::= '<?xml' VersionInfo? EncodingDecl S? '?>' TextDecl := "<?" xml_ [ VersionInfo ] EncodingDecl [ S ] "?>" // Well-Formed External Parsed Entity // [78] extParsedEnt ::= TextDecl? content extParsedEnt := [ TextDecl ] content // Encoding Declaration // [80] EncodingDecl ::= S 'encoding' Eq ('"' EncName '"' | "'" EncName "'") // [81] EncName ::= [A-Za-z] ([A-Za-z0-9._] | '-')* // /* Encoding name contains only Latin characters */ EncodingDecl := S encoding_ Eq EncodingLiteral_ // (Lexical Rules) // EncodingLiteral_ ::= '"' EncName '"' | "'" EncName "'" // EncName := ( 'A'..'Z' | 'a'..'z' ) { 'A'..'Z' | 'a'..'z' | '0'..'9' | '.' | '_' | '-' }* // Notation Declarations // [82] NotationDecl ::= '<!NOTATION' S Name S (ExternalID | PublicID) S? '>' [VC: Unique Notation Name] // [83] PublicID ::= 'PUBLIC' S PubidLiteral NotationDecl := "<!" NOTATION_ S Name S ( ExternalID | PublicID ) [ S ] '>' PublicID := PUBLIC_ S PubidLiteral // (Productions 84 through 89 have been removed.) ExtensibleMarkupLanguage :: // Lexical Rules input := { S | Nmtoken | SystemLiteral | Comment | CDSect | element | conditionalSect | SeparatorOrOperator_ }* // Notes: // (1) No input is discarded during lexical parsing, i.e. white space and comments are treated as tokens // (2) Nmtoken also matches Name // (3) SystemLiteral also matches EntityValue, AttValue, PubidLiteral, // VersionLiteral_, StandaloneLiteral_ and EncodingLiteral_ // (4) We need to perform some syntax parsing to identify CharData, PIData_, CData and Ignore tokens // (from Character Range) Char := '\t' | '\n' | '\r' | 0x20..0xD7FF | 0xE000..0xFFFD | 0x10000..0x10FFFF // (from White Space) S ::= { ' ' | '\t' | '\r' | '\n' }+ // (from Names and Tokens) NameStartChar := ':' | 'A'..'Z' | '_' | 'a'..'z' | 0xC0..0xD6 | 0xD8..0xF6 | 0xF8..0x2FF | 0x370..0x37D | 0x37F..0x1FFF | 0x200C..0x200D | 0x2070..0x218F | 0x2C00..0x2FEF | 0x3001..0xD7FF | 0xF900..0xFDCF | 0xFDF0..0xFFFD | 0x10000..0xEFFFF NameChar := NameStartChar | '-' | '.' | '0'..'9' | 0xB7 | 0x0300..0x036F | 0x203F..0x2040 Name ::= NameStartChar { NameChar }* Names ::= Name { ' ' Name }* Nmtoken ::= { NameChar }+ Nmtokens ::= Nmtoken { ' ' Nmtoken }* // (from Literals) EntityValue ::= '"' { ! '%' ! '&' ! '"' Char | PEReference | Reference }* '"' | "'" { ! '%' ! '&' ! "'" Char | PEReference | Reference }* "'" AttValue := AttValueQuot_ { AttValueQuotData_ | Reference }* AttValueQuot_ | AttValueApos_ { AttValueAposData_ | Reference }* AttValueApos_ AttValueQuot_ ::= '"' AttValueQuotData_ ::= { ! '<' ! '&' ! '"' Char }+ AttValueApos_ ::= "'" AttValueAposData_ ::= { ! '<' ! '&' ! "'" Char }+ SystemLiteral ::= '"' { ! '"' Char }* '"' | "'" { ! "'" Char }* "'" PubidLiteral ::= '"' { PubidChar }* '"' | "'" { ! "'" PubidChar }* "'" PubidChar := ' ' | '\r' | '\n' | 'a'..'z' | 'A'..'Z' | '0'..'9' | '-' | "'" | '(' | ')' | '+' | ',' | '.' | '/' | ':' | '=' | '?' | ';' | '!' | '*' | '#' | '@' | '$' | '_' | '%' // (from Character Data) CharData ::= { ! '<' ! '&' ! SectEnd_ Char }* // (from Comments) Comment ::= "<!--" { ! "--" Char }* "-->" // (from Processing Instructions) PI := PIStart_ PITarget [ S PIData_ ] PIEnd_ PITarget := ! ( ( 'X' | 'x' ) ( 'M' | 'm' ) ( 'L' | 'l' ) ! NameChar ) Name PIData_ ::= { ! PIEnd_ Char }* // (from CDATA Sections) CDSect := CDStart CData CDEnd CDStart := SectStart_ CDATA_ SectBegin_ CData ::= { ! SectEnd_ Char }* CDEnd := SectEnd_ // (from Prolog) Eq := [ S ] EqOperator_ [ S ] VersionLiteral_ ::= "'" VersionNum "'" | '"' VersionNum '"' VersionNum := "1." { '0'..'9' }+ // (from Standalone Document Declaration) StandaloneLiteral_ ::= "'" ( "yes" | "no" ) "'" | '"' ( "yes" | "no" ) '"' // (from Element) element := EmptyElemTag | STag content ETag // (from Start-tag) STag := TagStart_ Name { S Attribute }* [ S ] TagEnd_ Attribute := Name Eq AttValue // (from End-tag) ETag := ETagStart_ Name [ S ] TagEnd_ // (from Content of Elements) content := [ CharData ] { ( element | Reference | CDSect | PI | Comment ) [ CharData ] }* // (from Tags for Empty Elements) EmptyElemTag := TagStart_ Name { S Attribute }* [ S ] EmptyElemTagEnd_ // (from Conditional Section) conditionalSect := includeSect | ignoreSect includeSect := SectStart_ [ S ] INCLUDE_ [ S ] SectBegin_ extSubsetDecl SectEnd_ ignoreSect := SectStart_ [ S ] IGNORE_ [ S ] SectBegin_ { ignoreSectContents }* SectEnd_ ignoreSectContents := Ignore { SectStart_ ignoreSectContents SectEnd_ Ignore }* Ignore ::= { ! SectStart_ ! SectEnd_ Char }* // (from Character Reference) CharRef ::= "&#" { '0'..'9' }+ ';' | "&#x" { '0'..'9' | 'a'..'f' | 'A'..'F' }+ ';' // (from Entity Reference) Reference := EntityRef | CharRef EntityRef ::= '&' Name ';' PEReference ::= '%' Name ';' // (from Encoding Declaration) EncodingLiteral_ ::= '"' EncName '"' | "'" EncName "'" EncName := ( 'A'..'Z' | 'a'..'z' ) { 'A'..'Z' | 'a'..'z' | '0'..'9' | '.' | '_' | '-' }* // Separators and Operators SeparatorOrOperator_ ::= "<![" | "]]>" | "/>" | "<!" | "</" | "<?" | "?>" | '#' | '%' | '(' | ')' | '*' | '+' | ',' | '<' | '=' | '>' | '?' | '[' | ']' | '|' PIStart_ ::= "<?" PIEnd_ ::= "?>" SectStart_ ::= "<![" SectBegin_ ::= '[' SectEnd_ ::= "]]>" EqOperator_ ::= '=' TagStart_ ::= '<' TagEnd_ ::= '>' ETagStart_ ::= "</" EmptyElemTagEnd_ ::= "/>" // Keywords Keyword_ := ANY_ | ATTLIST_ | CDATA_ | DOCTYPE_ | ELEMENT_ | EMPTY_ | ENTITIES_ | ENTITY_ | FIXED_ | ID_ | IDREF_ | IDREFS_ | IGNORE_ | IMPLIED_ | INCLUDE_ | NDATA_ | NMTOKEN_ | NMTOKENS_ | NOTATION_ | PCDATA_ | PUBLIC_ | REQUIRED_ | SYSTEM_ | encoding_ | standalone_ | version_ | xml_ ANY_ ::= "ANY" ! NameChar ATTLIST_ ::= "ATTLIST" ! NameChar CDATA_ ::= "CDATA" ! NameChar DOCTYPE_ ::= "DOCTYPE" ! NameChar ELEMENT_ ::= "ELEMENT" ! NameChar EMPTY_ ::= "EMPTY" ! NameChar ENTITIES_ ::= "ENTITIES" ! NameChar ENTITY_ ::= "ENTITY" ! NameChar FIXED_ ::= "FIXED" ! NameChar ID_ ::= "ID" ! NameChar IDREF_ ::= "IDREF" ! NameChar IDREFS_ ::= "IDREFS" ! NameChar IGNORE_ ::= "IGNORE" ! NameChar IMPLIED_ ::= "IMPLIED" ! NameChar INCLUDE_ ::= "INCLUDE" ! NameChar NDATA_ ::= "NDATA" ! NameChar NMTOKEN_ ::= "NMTOKEN" ! NameChar NMTOKENS_ ::= "NMTOKENS" ! NameChar NOTATION_ ::= "NOTATION" ! NameChar PCDATA_ ::= "PCDATA" ! NameChar PUBLIC_ ::= "PUBLIC" ! NameChar REQUIRED_ ::= "REQUIRED" ! NameChar SYSTEM_ ::= "SYSTEM" ! NameChar encoding_ ::= "encoding" ! NameChar standalone_ ::= "standalone" ! NameChar version_ ::= "version" ! NameChar xml_ ::= "xml" ! NameChar // End of File