]> gitweb.factorcode.org Git - factor.git/blobdiff - basis/xmode/modes/xsl.xml
xmode.modes: updating with recent xmode files
[factor.git] / basis / xmode / modes / xsl.xml
index 94a5610165ec9edb05a3f6718d42d013702f2d1c..cb6a6f2cec8e269cc313b757a4795e517df72ff1 100644 (file)
-<?xml version="1.0"?>\r
-<!DOCTYPE MODE SYSTEM "xmode.dtd"><!--\r
-  ======================================================================\r
-  Edit mode for XSLT 1.0 and XSLT 2.0\r
-  ======================================================================\r
-  Token types:\r
-\r
-  COMMENT1    XML comments\r
-  COMMENT2    XPath 2.0 comments - top or nested within COMMENT3\r
-  COMMENT3    XPath 2.0 comments - nested within COMMENT2\r
-  COMMENT4    Default task names used in Task List\r
-  DIGIT       Digits\r
-  FUNCTION    Functions\r
-  INVALID     -\r
-  KEYWORD1    XSLT element names\r
-  KEYWORD2    XSLT attribute names\r
-  KEYWORD3    Attribute values\r
-  KEYWORD4    Axes specifiers\r
-  LABEL       Namespace prefixes\r
-  LITERAL1    String literals\r
-  LITERAL2    Parameter and variable references\r
-  LITERAL3    Entity references and processing instructions\r
-  LITERAL4    DTD constructs and CDATA sections\r
-  MARKUP      Result elements and extension elements\r
-  OPERATOR    XPath 2.0 keywords + some other stuff\r
-  ======================================================================\r
--->\r
-\r
-<MODE>\r
-\r
-  <PROPS>\r
-    <PROPERTY NAME="commentStart" VALUE="&lt;!--"/>\r
-    <PROPERTY NAME="commentEnd" VALUE="--&gt;"/>\r
-  </PROPS>\r
-\r
-  <RULES HIGHLIGHT_DIGITS="FALSE" IGNORE_CASE="FALSE">\r
-\r
-    <!-- XML comments -->\r
-    <SPAN DELEGATE="TASKS" TYPE="COMMENT1">\r
-      <BEGIN>&lt;!--</BEGIN>\r
-      <END>--&gt;</END>\r
-    </SPAN>\r
-\r
-    <!-- Assume 'xsl' prefix for XSLT elements -->\r
-    <SPAN_REGEXP HASH_CHAR="&lt;" DELEGATE="XSLTAGS" TYPE="KEYWORD2">\r
-      <BEGIN>&lt;(?=xsl:)</BEGIN>\r
-      <END>&gt;</END>\r
-    </SPAN_REGEXP>\r
-\r
-    <SPAN_REGEXP HASH_CHAR="&lt;" DELEGATE="XSLTAGS" TYPE="KEYWORD2">\r
-      <BEGIN>&lt;(?=/xsl:)</BEGIN>\r
-      <END>&gt;</END>\r
-    </SPAN_REGEXP>\r
-\r
-    <!-- CDATA marked sections. Reuse common xml mode -->\r
-    <SPAN TYPE="KEYWORD2" DELEGATE="xml::CDATA">\r
-      <BEGIN>&lt;![CDATA[</BEGIN>\r
-      <END>]]&gt;</END>\r
-    </SPAN>\r
-\r
-    <!-- DTD constructs. Reuse common xml mode  -->\r
-    <SPAN TYPE="KEYWORD2" DELEGATE="xml::DTD-TAGS">\r
-      <BEGIN>&lt;!</BEGIN>\r
-      <END>&gt;</END>\r
-    </SPAN>\r
-\r
-    <!-- Entity references -->\r
-    <SPAN TYPE="LITERAL3" NO_WORD_BREAK="TRUE">\r
-      <BEGIN>&amp;</BEGIN>\r
-      <END>;</END>\r
-    </SPAN>\r
-\r
-    <!-- Processing instructions -->\r
-    <SPAN TYPE="LITERAL3">\r
-      <BEGIN>&lt;?</BEGIN>\r
-      <END>?&gt;</END>\r
-    </SPAN>\r
-\r
-    <!-- Result elements and extension elements -->\r
-    <SPAN DELEGATE="TAGS" TYPE="MARKUP">\r
-      <BEGIN>&lt;</BEGIN>\r
-      <END>&gt;</END>\r
-    </SPAN>\r
-  </RULES>\r
-\r
-  <!-- XML comments -->\r
-  <RULES DEFAULT="COMMENT1" IGNORE_CASE="FALSE" SET="TASKS">\r
-    <!-- Default task names used in Task List -->\r
-    <KEYWORDS>\r
-      <COMMENT4>DEBUG:</COMMENT4>\r
-      <COMMENT4>DONE:</COMMENT4>\r
-      <COMMENT4>FIXME:</COMMENT4>\r
-      <COMMENT4>IDEA:</COMMENT4>\r
-      <COMMENT4>NOTE:</COMMENT4>\r
-      <COMMENT4>QUESTION:</COMMENT4>\r
-      <COMMENT4>TODO:</COMMENT4>\r
-      <COMMENT4>XXX</COMMENT4>\r
-      <COMMENT4>???</COMMENT4>\r
-    </KEYWORDS>\r
-  </RULES>\r
-\r
-  <!-- Result elements and extension elements -->\r
-  <RULES DEFAULT="MARKUP" HIGHLIGHT_DIGITS="FALSE" NO_WORD_SEP=".-_:" SET="TAGS">\r
-\r
-    <!-- Highlight all AVTs in result attribute values. -->\r
-    <SPAN TYPE="MARKUP" DELEGATE="AVT">\r
-      <BEGIN>"</BEGIN>\r
-      <END>"</END>\r
-    </SPAN>\r
-    <SPAN TYPE="MARKUP" DELEGATE="AVT">\r
-      <BEGIN>'</BEGIN>\r
-      <END>'</END>\r
-    </SPAN>\r
-\r
-    <!-- Namespace declarations -->\r
-    <SEQ TYPE="OPERATOR">xmlns:</SEQ>\r
-    <!-- Default namespace declaration. Not really used in XSLT -->\r
-    <SEQ TYPE="OPERATOR">xmlns</SEQ>\r
-\r
-    <!-- Namespace prefixes -->\r
-    <MARK_PREVIOUS TYPE="LABEL">:</MARK_PREVIOUS>\r
-\r
-  </RULES>\r
-\r
-  <!-- AVTs -->\r
-  <RULES DEFAULT="KEYWORD3" HIGHLIGHT_DIGITS="FALSE" NO_WORD_SEP=".-_:" SET="AVT">\r
-\r
-    <!-- Literal curly braces ({}) must be written as {{ or }} -->\r
-    <SEQ>{{</SEQ>\r
-    <SEQ>}}</SEQ><!-- Does nothing. Is overridden by the SPAN below. -->\r
-\r
-    <!-- The AVT itself -->\r
-    <SPAN DELEGATE="XPATH" TYPE="OPERATOR">\r
-      <BEGIN>{</BEGIN>\r
-      <END>}</END>\r
-    </SPAN>\r
-\r
-    <!-- Entity references -->\r
-    <SPAN TYPE="LITERAL3" NO_WORD_BREAK="TRUE">\r
-      <BEGIN>&amp;</BEGIN>\r
-      <END>;</END>\r
-    </SPAN>\r
-\r
-  </RULES>\r
-\r
-  <!-- XSLT tags -->\r
-  <RULES DEFAULT="KEYWORD2" HIGHLIGHT_DIGITS="FALSE" NO_WORD_SEP=".-_:" SET="XSLTAGS">\r
-\r
-    <!-- If we spot something that looks like an AVT, assume it is. Lazy, I know... -->\r
-    <SPAN TYPE="KEYWORD2" DELEGATE="AVT">\r
-      <BEGIN>"</BEGIN>\r
-      <END>"</END>\r
-    </SPAN>\r
-    <SPAN TYPE="KEYWORD2" DELEGATE="AVT">\r
-      <BEGIN>'</BEGIN>\r
-      <END>'</END>\r
-    </SPAN>\r
-\r
-    <!-- XSLT attributes that contains XPath expressions or match patterns -->\r
-    <!-- count -->\r
-    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="count" DELEGATE="XPATH">\r
-      <BEGIN>count[\p{Space}]*=[\p{Space}]*"</BEGIN>\r
-      <END>"</END>\r
-    </SPAN_REGEXP>\r
-    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="count" DELEGATE="XPATH">\r
-      <BEGIN>count[\p{Space}]*=[\p{Space}]*'</BEGIN>\r
-      <END>'</END>\r
-    </SPAN_REGEXP>\r
-    <!-- from -->\r
-    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="from" DELEGATE="XPATH">\r
-      <BEGIN>from[\p{Space}]*=[\p{Space}]*"</BEGIN>\r
-      <END>"</END>\r
-    </SPAN_REGEXP>\r
-    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="from" DELEGATE="XPATH">\r
-      <BEGIN>from[\p{Space}]*=[\p{Space}]*'</BEGIN>\r
-      <END>'</END>\r
-    </SPAN_REGEXP>\r
-    <!-- group-adjacent -->\r
-    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="group-adjacent" DELEGATE="XPATH">\r
-      <BEGIN>group-adjacent[\p{Space}]*=[\p{Space}]*"</BEGIN>\r
-      <END>"</END>\r
-    </SPAN_REGEXP>\r
-    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="group-adjacent" DELEGATE="XPATH">\r
-      <BEGIN>group-adjacent[\p{Space}]*=[\p{Space}]*'</BEGIN>\r
-      <END>'</END>\r
-    </SPAN_REGEXP>\r
-    <!-- group-by -->\r
-    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="group-by" DELEGATE="XPATH">\r
-      <BEGIN>group-by[\p{Space}]*=[\p{Space}]*"</BEGIN>\r
-      <END>"</END>\r
-    </SPAN_REGEXP>\r
-    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="group-by" DELEGATE="XPATH">\r
-      <BEGIN>group-by[\p{Space}]*=[\p{Space}]*'</BEGIN>\r
-      <END>'</END>\r
-    </SPAN_REGEXP>\r
-    <!-- group-ending-with -->\r
-    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="group-ending-with" DELEGATE="XPATH">\r
-      <BEGIN>group-ending-with[\p{Space}]*=[\p{Space}]*"</BEGIN>\r
-      <END>"</END>\r
-    </SPAN_REGEXP>\r
-    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="group-ending-with" DELEGATE="XPATH">\r
-      <BEGIN>group-ending-with[\p{Space}]*=[\p{Space}]*'</BEGIN>\r
-      <END>'</END>\r
-    </SPAN_REGEXP>\r
-    <!-- group-starting-with -->\r
-    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="group-starting-with" DELEGATE="XPATH">\r
-      <BEGIN>group-starting-with[\p{Space}]*=[\p{Space}]*"</BEGIN>\r
-      <END>"</END>\r
-    </SPAN_REGEXP>\r
-    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="group-starting-with" DELEGATE="XPATH">\r
-      <BEGIN>group-starting-with[\p{Space}]*=[\p{Space}]*'</BEGIN>\r
-      <END>'</END>\r
-    </SPAN_REGEXP>\r
-    <!-- match -->\r
-    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="match" DELEGATE="XPATH">\r
-      <BEGIN>match[\p{Space}]*=[\p{Space}]*"</BEGIN>\r
-      <END>"</END>\r
-    </SPAN_REGEXP>\r
-    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="match" DELEGATE="XPATH">\r
-      <BEGIN>match[\p{Space}]*=[\p{Space}]*'</BEGIN>\r
-      <END>'</END>\r
-    </SPAN_REGEXP>\r
-    <!-- select -->\r
-    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="select" DELEGATE="XPATH">\r
-      <BEGIN>select[\p{Space}]*=[\p{Space}]*"</BEGIN>\r
-      <END>"</END>\r
-    </SPAN_REGEXP>\r
-    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="select" DELEGATE="XPATH">\r
-      <BEGIN>select[\p{Space}]*=[\p{Space}]*'</BEGIN>\r
-      <END>'</END>\r
-    </SPAN_REGEXP>\r
-    <!-- test -->\r
-    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="test" DELEGATE="XPATH">\r
-      <BEGIN>test[\p{Space}]*=[\p{Space}]*"</BEGIN>\r
-      <END>"</END>\r
-    </SPAN_REGEXP>\r
-    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="test" DELEGATE="XPATH">\r
-      <BEGIN>test[\p{Space}]*=[\p{Space}]*'</BEGIN>\r
-      <END>'</END>\r
-    </SPAN_REGEXP>\r
-    <!-- use -->\r
-    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="use" DELEGATE="XPATH">\r
-      <BEGIN>use[\p{Space}]*=[\p{Space}]*"</BEGIN>\r
-      <END>"</END>\r
-    </SPAN_REGEXP>\r
-    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="use" DELEGATE="XPATH">\r
-      <BEGIN>use[\p{Space}]*=[\p{Space}]*'</BEGIN>\r
-      <END>'</END>\r
-    </SPAN_REGEXP>\r
-\r
-    <!-- Namespace declarations -->\r
-    <SEQ TYPE="OPERATOR">xmlns:</SEQ>\r
-    <!-- Default namespace declaration. Not really used in XSLT -->\r
-    <SEQ TYPE="OPERATOR">xmlns</SEQ>\r
-\r
-    <!-- Namespace prefixes -->\r
-    <MARK_PREVIOUS TYPE="LABEL">:</MARK_PREVIOUS>\r
-\r
-    <!-- XSLT 2.0 element names -->\r
-    <KEYWORDS>\r
-      <KEYWORD1>analyze-string</KEYWORD1>\r
-      <KEYWORD1>apply-imports</KEYWORD1>\r
-      <KEYWORD1>apply-templates</KEYWORD1>\r
-      <KEYWORD1>attribute</KEYWORD1>\r
-      <KEYWORD1>attribute-set</KEYWORD1>\r
-      <KEYWORD1>call-template</KEYWORD1>\r
-      <KEYWORD1>character-map</KEYWORD1>\r
-      <KEYWORD1>choose</KEYWORD1>\r
-      <KEYWORD1>comment</KEYWORD1>\r
-      <KEYWORD1>copy</KEYWORD1>\r
-      <KEYWORD1>copy-of</KEYWORD1>\r
-      <KEYWORD1>date-format</KEYWORD1>\r
-      <KEYWORD1>decimal-format</KEYWORD1>\r
-      <KEYWORD1>element</KEYWORD1>\r
-      <KEYWORD1>fallback</KEYWORD1>\r
-      <KEYWORD1>for-each</KEYWORD1>\r
-      <KEYWORD1>for-each-group</KEYWORD1>\r
-      <KEYWORD1>function</KEYWORD1>\r
-      <KEYWORD1>if</KEYWORD1>\r
-      <KEYWORD1>import</KEYWORD1>\r
-      <KEYWORD1>import-schema</KEYWORD1>\r
-      <KEYWORD1>include</KEYWORD1>\r
-      <KEYWORD1>key</KEYWORD1>\r
-      <KEYWORD1>matching-substring</KEYWORD1>\r
-      <KEYWORD1>message</KEYWORD1>\r
-      <KEYWORD1>namespace</KEYWORD1>\r
-      <KEYWORD1>namespace-alias</KEYWORD1>\r
-      <KEYWORD1>next-match</KEYWORD1>\r
-      <KEYWORD1>non-matching-substring</KEYWORD1>\r
-      <KEYWORD1>number</KEYWORD1>\r
-      <KEYWORD1>otherwise</KEYWORD1>\r
-      <KEYWORD1>output</KEYWORD1>\r
-      <KEYWORD1>output-character</KEYWORD1>\r
-      <KEYWORD1>param</KEYWORD1>\r
-      <KEYWORD1>preserve-space</KEYWORD1>\r
-      <KEYWORD1>processing-instruction</KEYWORD1>\r
-      <KEYWORD1>result-document</KEYWORD1>\r
-      <KEYWORD1>sequence</KEYWORD1>\r
-      <KEYWORD1>sort</KEYWORD1>\r
-      <KEYWORD1>sort-key</KEYWORD1>\r
-      <KEYWORD1>strip-space</KEYWORD1>\r
-      <KEYWORD1>stylesheet</KEYWORD1>\r
-      <KEYWORD1>template</KEYWORD1>\r
-      <KEYWORD1>text</KEYWORD1>\r
-      <KEYWORD1>transform</KEYWORD1>\r
-      <KEYWORD1>value-of</KEYWORD1>\r
-      <KEYWORD1>variable</KEYWORD1>\r
-      <KEYWORD1>when</KEYWORD1>\r
-      <KEYWORD1>with-param</KEYWORD1>\r
-    </KEYWORDS>\r
-\r
-  </RULES>\r
-\r
-  <RULES DEFAULT="KEYWORD3" HIGHLIGHT_DIGITS="TRUE" DIGIT_RE="[\p{Digit}]+([\p{Punct}][\p{Digit}]+)?" NO_WORD_SEP=".-_" SET="XPATH">\r
-    <!-- String literals -->\r
-    <SPAN TYPE="LITERAL1">\r
-      <BEGIN>"</BEGIN>\r
-      <END>"</END>\r
-    </SPAN>\r
-    <SPAN TYPE="LITERAL1">\r
-      <BEGIN>'</BEGIN>\r
-      <END>'</END>\r
-    </SPAN>\r
-\r
-    <!-- XPath comments -->\r
-    <SPAN TYPE="COMMENT2" DELEGATE="XPATHCOMMENT2">\r
-      <BEGIN>(:</BEGIN>\r
-      <END>:)</END>\r
-    </SPAN>\r
-\r
-    <!-- Axes specifiers -->\r
-    <MARK_PREVIOUS TYPE="KEYWORD4">::</MARK_PREVIOUS>\r
-    <!-- Abbreviated 'attribute::' -->\r
-    <SEQ TYPE="KEYWORD4">@</SEQ>\r
-\r
-    <!-- XPath 2.0 operators + some other stuff -->\r
-    <!-- Comparison expressions -->\r
-    <SEQ TYPE="OPERATOR">=</SEQ>\r
-    <SEQ TYPE="OPERATOR">!=</SEQ>\r
-    <SEQ TYPE="OPERATOR">&gt;</SEQ>\r
-    <SEQ TYPE="OPERATOR">&amp;gt;</SEQ><!-- Treat as operator -->\r
-    <SEQ TYPE="OPERATOR">&amp;lt;</SEQ><!-- Treat as operator -->\r
-    <!-- Optional occurrence indicator -->\r
-    <SEQ TYPE="OPERATOR">?</SEQ>\r
-    <!-- Addition operator, one-or-more occurrence indicator-->\r
-    <SEQ TYPE="OPERATOR">+</SEQ>\r
-    <!-- Multiplication operator, zero-or-more occurrence indicator, node test -->\r
-    <SEQ TYPE="OPERATOR">*</SEQ>\r
-    <!-- Path expression step separator -->\r
-    <SEQ TYPE="OPERATOR">/</SEQ>\r
-    <!-- Union operator -->\r
-    <SEQ TYPE="OPERATOR">|</SEQ>\r
-    <!-- Sequence expression item separator -->\r
-    <SEQ TYPE="OPERATOR">,</SEQ>\r
-\r
-    <!-- Predicates -->\r
-    <SPAN TYPE="OPERATOR" DELEGATE="XPATH">\r
-      <BEGIN>[</BEGIN>\r
-      <END>]</END>\r
-    </SPAN>\r
-\r
-    <!-- Entity references -->\r
-    <SPAN TYPE="LITERAL3" NO_WORD_BREAK="TRUE">\r
-      <BEGIN>&amp;</BEGIN>\r
-      <END>;</END>\r
-    </SPAN>\r
-\r
-    <!-- Namespace prefixes -->\r
-    <MARK_PREVIOUS TYPE="LABEL">:</MARK_PREVIOUS>\r
-\r
-    <!-- Functions -->\r
-    <MARK_PREVIOUS TYPE="FUNCTION" MATCH_TYPE="OPERATOR">(</MARK_PREVIOUS>\r
-       <SEQ TYPE="OPERATOR">)</SEQ>\r
-\r
-    <!-- Variables -->\r
-    <MARK_FOLLOWING TYPE="LITERAL2">$</MARK_FOLLOWING>\r
-    <!-- XPath 2.0 keywords + some other stuff -->\r
-    <KEYWORDS>\r
-      <!-- Keywords -->\r
-      <OPERATOR>and</OPERATOR>\r
-      <OPERATOR>as</OPERATOR>\r
-      <OPERATOR>castable</OPERATOR>\r
-      <OPERATOR>div</OPERATOR>\r
-      <OPERATOR>else</OPERATOR>\r
-      <OPERATOR>eq</OPERATOR>\r
-      <OPERATOR>every</OPERATOR>\r
-      <OPERATOR>except</OPERATOR>\r
-      <OPERATOR>for</OPERATOR>\r
-      <OPERATOR>ge</OPERATOR>\r
-      <OPERATOR>gt</OPERATOR>\r
-      <OPERATOR>idiv</OPERATOR>\r
-      <OPERATOR>if</OPERATOR>\r
-      <OPERATOR>in</OPERATOR>\r
-      <OPERATOR>instance</OPERATOR>\r
-      <OPERATOR>intersect</OPERATOR>\r
-      <OPERATOR>is</OPERATOR>\r
-      <OPERATOR>isnot</OPERATOR>\r
-      <OPERATOR>le</OPERATOR>\r
-      <OPERATOR>lt</OPERATOR>\r
-      <OPERATOR>mod</OPERATOR>\r
-      <OPERATOR>nillable</OPERATOR>\r
-      <OPERATOR>ne</OPERATOR>\r
-      <OPERATOR>of</OPERATOR>\r
-      <OPERATOR>or</OPERATOR>\r
-      <OPERATOR>return</OPERATOR>\r
-      <OPERATOR>satisfies</OPERATOR>\r
-      <OPERATOR>some</OPERATOR>\r
-      <OPERATOR>then</OPERATOR>\r
-      <OPERATOR>to</OPERATOR>\r
-      <OPERATOR>treat</OPERATOR>\r
-      <OPERATOR>union</OPERATOR>\r
-\r
-      <!-- Subtraction operator -->\r
-      <OPERATOR>-</OPERATOR>\r
-\r
-    </KEYWORDS>\r
-\r
-  </RULES>\r
-\r
-  <!-- XPath comments - top or nested within COMMENT3 -->\r
-  <RULES DEFAULT="COMMENT2" SET="XPATHCOMMENT2">\r
-    <SPAN TYPE="COMMENT3" DELEGATE="XPATHCOMMENT3">\r
-      <BEGIN>(:</BEGIN>\r
-      <END>:)</END>\r
-    </SPAN>\r
-  </RULES>\r
-\r
-  <!-- XPath comments - nested within COMMENT2 -->\r
-  <RULES DEFAULT="COMMENT3" SET="XPATHCOMMENT3">\r
-    <SPAN TYPE="COMMENT2" DELEGATE="XPATHCOMMENT2">\r
-      <BEGIN>(:</BEGIN>\r
-      <END>:)</END>\r
-    </SPAN>\r
-  </RULES>\r
-\r
-</MODE>\r
+<?xml version="1.0"?>
+<!DOCTYPE MODE SYSTEM "xmode.dtd"><!--
+  ======================================================================
+  Edit mode for XSLT 1.0 and XSLT 2.0
+  ======================================================================
+  Token types:
+
+  COMMENT1    XML comments
+  COMMENT2    XPath 2.0 comments - top or nested within COMMENT3
+  COMMENT3    XPath 2.0 comments - nested within COMMENT2
+  COMMENT4    Default task names used in Task List
+  DIGIT       Digits
+  FUNCTION    Functions
+  INVALID     -
+  KEYWORD1    XSLT element names
+  KEYWORD2    XSLT attribute names
+  KEYWORD3    Attribute values
+  KEYWORD4    Axes specifiers
+  LABEL       Namespace prefixes
+  LITERAL1    String literals
+  LITERAL2    Parameter and variable references
+  LITERAL3    Entity references and processing instructions
+  LITERAL4    DTD constructs and CDATA sections
+  MARKUP      Result elements and extension elements
+  OPERATOR    XPath 2.0 keywords + some other stuff
+  ======================================================================
+-->
+
+<MODE>
+
+  <PROPS>
+    <PROPERTY NAME="commentStart" VALUE="&lt;!--"/>
+    <PROPERTY NAME="commentEnd" VALUE="--&gt;"/>
+  </PROPS>
+
+  <RULES HIGHLIGHT_DIGITS="FALSE" IGNORE_CASE="FALSE">
+
+    <!-- XML comments -->
+    <SPAN DELEGATE="TASKS" TYPE="COMMENT1">
+      <BEGIN>&lt;!--</BEGIN>
+      <END>--&gt;</END>
+    </SPAN>
+
+    <!-- Assume 'xsl' prefix for XSLT elements -->
+    <SPAN_REGEXP HASH_CHAR="&lt;" DELEGATE="XSLTAGS" TYPE="KEYWORD2">
+      <BEGIN>&lt;(?=xsl:)</BEGIN>
+      <END>&gt;</END>
+    </SPAN_REGEXP>
+
+    <SPAN_REGEXP HASH_CHAR="&lt;" DELEGATE="XSLTAGS" TYPE="KEYWORD2">
+      <BEGIN>&lt;(?=/xsl:)</BEGIN>
+      <END>&gt;</END>
+    </SPAN_REGEXP>
+
+    <!-- CDATA marked sections. Reuse common xml mode -->
+    <SPAN TYPE="KEYWORD2" DELEGATE="xml::CDATA">
+      <BEGIN>&lt;![CDATA[</BEGIN>
+      <END>]]&gt;</END>
+    </SPAN>
+
+    <!-- DTD constructs. Reuse common xml mode  -->
+    <SPAN TYPE="KEYWORD2" DELEGATE="xml::DTD-TAGS">
+      <BEGIN>&lt;!</BEGIN>
+      <END>&gt;</END>
+    </SPAN>
+
+    <!-- Entity references -->
+    <SPAN TYPE="LITERAL3" NO_WORD_BREAK="TRUE">
+      <BEGIN>&amp;</BEGIN>
+      <END>;</END>
+    </SPAN>
+
+    <!-- Processing instructions -->
+    <SPAN TYPE="LITERAL3">
+      <BEGIN>&lt;?</BEGIN>
+      <END>?&gt;</END>
+    </SPAN>
+
+    <!-- Result elements and extension elements -->
+    <SPAN DELEGATE="TAGS" TYPE="MARKUP">
+      <BEGIN>&lt;</BEGIN>
+      <END>&gt;</END>
+    </SPAN>
+  </RULES>
+
+  <!-- XML comments -->
+  <RULES DEFAULT="COMMENT1" IGNORE_CASE="FALSE" SET="TASKS">
+    <!-- Default task names used in Task List -->
+    <KEYWORDS>
+      <COMMENT4>DEBUG:</COMMENT4>
+      <COMMENT4>DONE:</COMMENT4>
+      <COMMENT4>FIXME:</COMMENT4>
+      <COMMENT4>IDEA:</COMMENT4>
+      <COMMENT4>NOTE:</COMMENT4>
+      <COMMENT4>QUESTION:</COMMENT4>
+      <COMMENT4>TODO:</COMMENT4>
+      <COMMENT4>XXX</COMMENT4>
+      <COMMENT4>???</COMMENT4>
+    </KEYWORDS>
+  </RULES>
+
+  <!-- Result elements and extension elements -->
+  <RULES DEFAULT="MARKUP" HIGHLIGHT_DIGITS="FALSE" NO_WORD_SEP=".-_:" SET="TAGS">
+
+    <!-- Highlight all AVTs in result attribute values. -->
+    <SPAN TYPE="MARKUP" DELEGATE="AVT">
+      <BEGIN>"</BEGIN>
+      <END>"</END>
+    </SPAN>
+    <SPAN TYPE="MARKUP" DELEGATE="AVT">
+      <BEGIN>'</BEGIN>
+      <END>'</END>
+    </SPAN>
+
+    <!-- Namespace declarations -->
+    <SEQ TYPE="OPERATOR">xmlns:</SEQ>
+    <!-- Default namespace declaration. Not really used in XSLT -->
+    <SEQ TYPE="OPERATOR">xmlns</SEQ>
+
+    <!-- Namespace prefixes -->
+    <MARK_PREVIOUS TYPE="LABEL">:</MARK_PREVIOUS>
+
+  </RULES>
+
+  <!-- AVTs -->
+  <RULES DEFAULT="KEYWORD3" HIGHLIGHT_DIGITS="FALSE" NO_WORD_SEP=".-_:" SET="AVT">
+
+    <!-- Literal curly braces ({}) must be written as {{ or }} -->
+    <SEQ>{{</SEQ>
+    <SEQ>}}</SEQ><!-- Does nothing. Is overridden by the SPAN below. -->
+
+    <!-- The AVT itself -->
+    <SPAN DELEGATE="XPATH" TYPE="OPERATOR">
+      <BEGIN>{</BEGIN>
+      <END>}</END>
+    </SPAN>
+
+    <!-- Entity references -->
+    <SPAN TYPE="LITERAL3" NO_WORD_BREAK="TRUE">
+      <BEGIN>&amp;</BEGIN>
+      <END>;</END>
+    </SPAN>
+
+  </RULES>
+
+  <!-- XSLT tags -->
+  <RULES DEFAULT="KEYWORD2" HIGHLIGHT_DIGITS="FALSE" NO_WORD_SEP=".-_:" SET="XSLTAGS">
+
+    <!-- If we spot something that looks like an AVT, assume it is. Lazy, I know... -->
+    <SPAN TYPE="KEYWORD2" DELEGATE="AVT">
+      <BEGIN>"</BEGIN>
+      <END>"</END>
+    </SPAN>
+    <SPAN TYPE="KEYWORD2" DELEGATE="AVT">
+      <BEGIN>'</BEGIN>
+      <END>'</END>
+    </SPAN>
+
+    <!-- XSLT attributes that contains XPath expressions or match patterns -->
+    <!-- count -->
+    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="count" DELEGATE="XPATH">
+      <BEGIN>count[\p{Space}]*=[\p{Space}]*"</BEGIN>
+      <END>"</END>
+    </SPAN_REGEXP>
+    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="count" DELEGATE="XPATH">
+      <BEGIN>count[\p{Space}]*=[\p{Space}]*'</BEGIN>
+      <END>'</END>
+    </SPAN_REGEXP>
+    <!-- from -->
+    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="from" DELEGATE="XPATH">
+      <BEGIN>from[\p{Space}]*=[\p{Space}]*"</BEGIN>
+      <END>"</END>
+    </SPAN_REGEXP>
+    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="from" DELEGATE="XPATH">
+      <BEGIN>from[\p{Space}]*=[\p{Space}]*'</BEGIN>
+      <END>'</END>
+    </SPAN_REGEXP>
+    <!-- group-adjacent -->
+    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="group-adjacent" DELEGATE="XPATH">
+      <BEGIN>group-adjacent[\p{Space}]*=[\p{Space}]*"</BEGIN>
+      <END>"</END>
+    </SPAN_REGEXP>
+    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="group-adjacent" DELEGATE="XPATH">
+      <BEGIN>group-adjacent[\p{Space}]*=[\p{Space}]*'</BEGIN>
+      <END>'</END>
+    </SPAN_REGEXP>
+    <!-- group-by -->
+    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="group-by" DELEGATE="XPATH">
+      <BEGIN>group-by[\p{Space}]*=[\p{Space}]*"</BEGIN>
+      <END>"</END>
+    </SPAN_REGEXP>
+    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="group-by" DELEGATE="XPATH">
+      <BEGIN>group-by[\p{Space}]*=[\p{Space}]*'</BEGIN>
+      <END>'</END>
+    </SPAN_REGEXP>
+    <!-- group-ending-with -->
+    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="group-ending-with" DELEGATE="XPATH">
+      <BEGIN>group-ending-with[\p{Space}]*=[\p{Space}]*"</BEGIN>
+      <END>"</END>
+    </SPAN_REGEXP>
+    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="group-ending-with" DELEGATE="XPATH">
+      <BEGIN>group-ending-with[\p{Space}]*=[\p{Space}]*'</BEGIN>
+      <END>'</END>
+    </SPAN_REGEXP>
+    <!-- group-starting-with -->
+    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="group-starting-with" DELEGATE="XPATH">
+      <BEGIN>group-starting-with[\p{Space}]*=[\p{Space}]*"</BEGIN>
+      <END>"</END>
+    </SPAN_REGEXP>
+    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="group-starting-with" DELEGATE="XPATH">
+      <BEGIN>group-starting-with[\p{Space}]*=[\p{Space}]*'</BEGIN>
+      <END>'</END>
+    </SPAN_REGEXP>
+    <!-- match -->
+    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="match" DELEGATE="XPATH">
+      <BEGIN>match[\p{Space}]*=[\p{Space}]*"</BEGIN>
+      <END>"</END>
+    </SPAN_REGEXP>
+    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="match" DELEGATE="XPATH">
+      <BEGIN>match[\p{Space}]*=[\p{Space}]*'</BEGIN>
+      <END>'</END>
+    </SPAN_REGEXP>
+    <!-- select -->
+    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="select" DELEGATE="XPATH">
+      <BEGIN>select[\p{Space}]*=[\p{Space}]*"</BEGIN>
+      <END>"</END>
+    </SPAN_REGEXP>
+    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="select" DELEGATE="XPATH">
+      <BEGIN>select[\p{Space}]*=[\p{Space}]*'</BEGIN>
+      <END>'</END>
+    </SPAN_REGEXP>
+    <!-- test -->
+    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="test" DELEGATE="XPATH">
+      <BEGIN>test[\p{Space}]*=[\p{Space}]*"</BEGIN>
+      <END>"</END>
+    </SPAN_REGEXP>
+    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="test" DELEGATE="XPATH">
+      <BEGIN>test[\p{Space}]*=[\p{Space}]*'</BEGIN>
+      <END>'</END>
+    </SPAN_REGEXP>
+    <!-- use -->
+    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="use" DELEGATE="XPATH">
+      <BEGIN>use[\p{Space}]*=[\p{Space}]*"</BEGIN>
+      <END>"</END>
+    </SPAN_REGEXP>
+    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="use" DELEGATE="XPATH">
+      <BEGIN>use[\p{Space}]*=[\p{Space}]*'</BEGIN>
+      <END>'</END>
+    </SPAN_REGEXP>
+    <!-- value -->
+    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="value" DELEGATE="XPATH">
+      <BEGIN>value[\p{Space}]*=[\p{Space}]*"</BEGIN>
+      <END>"</END>
+    </SPAN_REGEXP>
+    <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="select" DELEGATE="XPATH">
+      <BEGIN>select[\p{Space}]*=[\p{Space}]*'</BEGIN>
+      <END>'</END>
+    </SPAN_REGEXP>
+
+    <!-- Namespace declarations -->
+    <SEQ TYPE="OPERATOR">xmlns:</SEQ>
+    <!-- Default namespace declaration. Not really used in XSLT -->
+    <SEQ TYPE="OPERATOR">xmlns</SEQ>
+
+    <!-- Namespace prefixes -->
+    <MARK_PREVIOUS TYPE="LABEL">:</MARK_PREVIOUS>
+
+    <!-- XSLT 2.0 element names -->
+    <KEYWORDS>
+      <KEYWORD1>analyze-string</KEYWORD1>
+      <KEYWORD1>apply-imports</KEYWORD1>
+      <KEYWORD1>apply-templates</KEYWORD1>
+      <KEYWORD1>attribute</KEYWORD1>
+      <KEYWORD1>attribute-set</KEYWORD1>
+      <KEYWORD1>call-template</KEYWORD1>
+      <KEYWORD1>character-map</KEYWORD1>
+      <KEYWORD1>choose</KEYWORD1>
+      <KEYWORD1>comment</KEYWORD1>
+      <KEYWORD1>copy</KEYWORD1>
+      <KEYWORD1>copy-of</KEYWORD1>
+      <KEYWORD1>decimal-format</KEYWORD1>
+      <KEYWORD1>document</KEYWORD1>
+      <KEYWORD1>element</KEYWORD1>
+      <KEYWORD1>fallback</KEYWORD1>
+      <KEYWORD1>for-each</KEYWORD1>
+      <KEYWORD1>for-each-group</KEYWORD1>
+      <KEYWORD1>function</KEYWORD1>
+      <KEYWORD1>if</KEYWORD1>
+      <KEYWORD1>import</KEYWORD1>
+      <KEYWORD1>import-schema</KEYWORD1>
+      <KEYWORD1>include</KEYWORD1>
+      <KEYWORD1>key</KEYWORD1>
+      <KEYWORD1>matching-substring</KEYWORD1>
+      <KEYWORD1>message</KEYWORD1>
+      <KEYWORD1>namespace</KEYWORD1>
+      <KEYWORD1>namespace-alias</KEYWORD1>
+      <KEYWORD1>next-match</KEYWORD1>
+      <KEYWORD1>non-matching-substring</KEYWORD1>
+      <KEYWORD1>number</KEYWORD1>
+      <KEYWORD1>otherwise</KEYWORD1>
+      <KEYWORD1>output</KEYWORD1>
+      <KEYWORD1>output-character</KEYWORD1>
+      <KEYWORD1>param</KEYWORD1>
+      <KEYWORD1>perform-sort</KEYWORD1>
+      <KEYWORD1>preserve-space</KEYWORD1>
+      <KEYWORD1>processing-instruction</KEYWORD1>
+      <KEYWORD1>result-document</KEYWORD1>
+      <KEYWORD1>sequence</KEYWORD1>
+      <KEYWORD1>sort</KEYWORD1>
+      <KEYWORD1>strip-space</KEYWORD1>
+      <KEYWORD1>stylesheet</KEYWORD1>
+      <KEYWORD1>template</KEYWORD1>
+      <KEYWORD1>text</KEYWORD1>
+      <KEYWORD1>transform</KEYWORD1>
+      <KEYWORD1>value-of</KEYWORD1>
+      <KEYWORD1>variable</KEYWORD1>
+      <KEYWORD1>when</KEYWORD1>
+      <KEYWORD1>with-param</KEYWORD1>
+    </KEYWORDS>
+
+  </RULES>
+
+  <RULES DEFAULT="KEYWORD3" HIGHLIGHT_DIGITS="TRUE" DIGIT_RE="[\p{Digit}]+([\p{Punct}][\p{Digit}]+)?" NO_WORD_SEP=".-_" SET="XPATH">
+    <!-- String literals -->
+    <SPAN TYPE="LITERAL1">
+      <BEGIN>"</BEGIN>
+      <END>"</END>
+    </SPAN>
+    <SPAN TYPE="LITERAL1">
+      <BEGIN>'</BEGIN>
+      <END>'</END>
+    </SPAN>
+
+    <!-- XPath comments -->
+    <SPAN TYPE="COMMENT2" DELEGATE="XPATHCOMMENT2">
+      <BEGIN>(:</BEGIN>
+      <END>:)</END>
+    </SPAN>
+
+    <!-- Axes specifiers -->
+    <MARK_PREVIOUS TYPE="KEYWORD4">::</MARK_PREVIOUS>
+    <!-- Abbreviated 'attribute::' -->
+    <SEQ TYPE="KEYWORD4">@</SEQ>
+
+    <!-- XPath 2.0 operators + some other stuff -->
+    <!-- Comparison expressions -->
+    <SEQ TYPE="OPERATOR">=</SEQ>
+    <SEQ TYPE="OPERATOR">!=</SEQ>
+    <SEQ TYPE="OPERATOR">&gt;</SEQ>
+    <SEQ TYPE="OPERATOR">&amp;gt;</SEQ><!-- Treat as operator -->
+    <SEQ TYPE="OPERATOR">&amp;lt;</SEQ><!-- Treat as operator -->
+    <!-- Optional occurrence indicator -->
+    <SEQ TYPE="OPERATOR">?</SEQ>
+    <!-- Addition operator, one-or-more occurrence indicator-->
+    <SEQ TYPE="OPERATOR">+</SEQ>
+    <!-- Multiplication operator, zero-or-more occurrence indicator, node test -->
+    <SEQ TYPE="OPERATOR">*</SEQ>
+    <!-- Path expression step separator -->
+    <SEQ TYPE="OPERATOR">/</SEQ>
+    <!-- Union operator -->
+    <SEQ TYPE="OPERATOR">|</SEQ>
+    <!-- Sequence expression item separator -->
+    <SEQ TYPE="OPERATOR">,</SEQ>
+
+    <!-- Predicates -->
+    <SPAN TYPE="OPERATOR" DELEGATE="XPATH">
+      <BEGIN>[</BEGIN>
+      <END>]</END>
+    </SPAN>
+
+    <!-- Entity references -->
+    <SPAN TYPE="LITERAL3" NO_WORD_BREAK="TRUE">
+      <BEGIN>&amp;</BEGIN>
+      <END>;</END>
+    </SPAN>
+
+    <!-- Namespace prefixes -->
+    <MARK_PREVIOUS TYPE="LABEL">:</MARK_PREVIOUS>
+
+    <!-- Functions -->
+    <MARK_PREVIOUS TYPE="FUNCTION" MATCH_TYPE="OPERATOR">(</MARK_PREVIOUS>
+       <SEQ TYPE="OPERATOR">)</SEQ>
+
+    <!-- Variables -->
+    <MARK_FOLLOWING TYPE="LITERAL2">$</MARK_FOLLOWING>
+    <!-- XPath 2.0 keywords + some other stuff -->
+    <KEYWORDS>
+      <!-- Keywords -->
+      <OPERATOR>and</OPERATOR>
+      <OPERATOR>as</OPERATOR>
+      <OPERATOR>castable</OPERATOR>
+      <OPERATOR>div</OPERATOR>
+      <OPERATOR>else</OPERATOR>
+      <OPERATOR>eq</OPERATOR>
+      <OPERATOR>every</OPERATOR>
+      <OPERATOR>except</OPERATOR>
+      <OPERATOR>for</OPERATOR>
+      <OPERATOR>ge</OPERATOR>
+      <OPERATOR>gt</OPERATOR>
+      <OPERATOR>idiv</OPERATOR>
+      <OPERATOR>if</OPERATOR>
+      <OPERATOR>in</OPERATOR>
+      <OPERATOR>instance</OPERATOR>
+      <OPERATOR>intersect</OPERATOR>
+      <OPERATOR>is</OPERATOR>
+      <OPERATOR>isnot</OPERATOR>
+      <OPERATOR>le</OPERATOR>
+      <OPERATOR>lt</OPERATOR>
+      <OPERATOR>mod</OPERATOR>
+      <OPERATOR>nillable</OPERATOR>
+      <OPERATOR>ne</OPERATOR>
+      <OPERATOR>of</OPERATOR>
+      <OPERATOR>or</OPERATOR>
+      <OPERATOR>return</OPERATOR>
+      <OPERATOR>satisfies</OPERATOR>
+      <OPERATOR>some</OPERATOR>
+      <OPERATOR>then</OPERATOR>
+      <OPERATOR>to</OPERATOR>
+      <OPERATOR>treat</OPERATOR>
+      <OPERATOR>union</OPERATOR>
+
+      <!-- Subtraction operator -->
+      <OPERATOR>-</OPERATOR>
+
+    </KEYWORDS>
+
+  </RULES>
+
+  <!-- XPath comments - top or nested within COMMENT3 -->
+  <RULES DEFAULT="COMMENT2" SET="XPATHCOMMENT2">
+    <SPAN TYPE="COMMENT3" DELEGATE="XPATHCOMMENT3">
+      <BEGIN>(:</BEGIN>
+      <END>:)</END>
+    </SPAN>
+  </RULES>
+
+  <!-- XPath comments - nested within COMMENT2 -->
+  <RULES DEFAULT="COMMENT3" SET="XPATHCOMMENT3">
+    <SPAN TYPE="COMMENT2" DELEGATE="XPATHCOMMENT2">
+      <BEGIN>(:</BEGIN>
+      <END>:)</END>
+    </SPAN>
+  </RULES>
+
+</MODE>
+
+