Grammar
XPattern grammar
The following defines the grammar of the XPattern:
<pattern> ::= <orlist> | <orlist> ':' <pattern>
<orlist> ::= <node> | <node> '|' <orlist>
<node> ::= <elementname> <opt-cardinality> <opt-assignment> <opt-modifierlist>
<opt-attrlist> <opt-childnodes> <opt-negation> |
'(' <pattern> ')' <opt-cardinality> <opt-assignment>
<elementname> ::= <name> | "any" | "#text" | "#comment"
<opt-attrlist> ::= "" | "[" <attrlist> "]"
<attrlist> ::= <attr> | <attr> "," <attrlist>
<attr> ::= "@" <name> <opt-relation> <opt-assignment> | <regexp>
<opt-relation> ::= "" | <compare> <value>
<compare> ::= "=" | "~"
<opt-modifierlist> ::= "" | <modifier> <opt-modifierlist>
<modifier> ::= "-html" | "-xml" | "-textcontent" | "-whitespace"
<opt-childnodes> ::= "" | "{" <pattern> "}"
<opt-assignment> ::= "" | "$" <name>
<opt-cardinality> ::= "" | <plain-cardinality> | <plain-cardinality> <nongreedy>
<plain-cardinality> ::= "?" | "*" | "+"
<nongreedy> ::= "?"
<regexp> ::= "/" <span class="caps">STRING</span> "/"
<value> ::= <span class="caps">INTEGER</span> | "\"" <span class="caps">STRING</span> "\""
<opt-negation> ::= "" | "!" <node>
<name> ::= <span class="caps">HTML</span>-friendly name, i.e. string starting with a-z followed by a-z0-9_. Match is case-insensitive.
<orlist> ::= <node> | <node> '|' <orlist>
<node> ::= <elementname> <opt-cardinality> <opt-assignment> <opt-modifierlist>
<opt-attrlist> <opt-childnodes> <opt-negation> |
'(' <pattern> ')' <opt-cardinality> <opt-assignment>
<elementname> ::= <name> | "any" | "#text" | "#comment"
<opt-attrlist> ::= "" | "[" <attrlist> "]"
<attrlist> ::= <attr> | <attr> "," <attrlist>
<attr> ::= "@" <name> <opt-relation> <opt-assignment> | <regexp>
<opt-relation> ::= "" | <compare> <value>
<compare> ::= "=" | "~"
<opt-modifierlist> ::= "" | <modifier> <opt-modifierlist>
<modifier> ::= "-html" | "-xml" | "-textcontent" | "-whitespace"
<opt-childnodes> ::= "" | "{" <pattern> "}"
<opt-assignment> ::= "" | "$" <name>
<opt-cardinality> ::= "" | <plain-cardinality> | <plain-cardinality> <nongreedy>
<plain-cardinality> ::= "?" | "*" | "+"
<nongreedy> ::= "?"
<regexp> ::= "/" <span class="caps">STRING</span> "/"
<value> ::= <span class="caps">INTEGER</span> | "\"" <span class="caps">STRING</span> "\""
<opt-negation> ::= "" | "!" <node>
<name> ::= <span class="caps">HTML</span>-friendly name, i.e. string starting with a-z followed by a-z0-9_. Match is case-insensitive.
