commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From dmi...@apache.org
Subject cvs commit: jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/compiler CoreFunction.java
Date Sat, 08 Jun 2002 22:47:25 GMT
dmitri      2002/06/08 15:47:25

  Modified:    jxpath/src/java/org/apache/commons/jxpath/ri/parser
                        XPathParserTokenManager.java
                        XPathParserConstants.java XPathParser.java XPath.jj
                        XPath.html
               jxpath/src/test/org/apache/commons/jxpath Vendor.xml
                        JXPathTestCase.java
               jxpath/xdocs users-guide.xml
               jxpath/src/java/org/apache/commons/jxpath/ri/model/beans
                        NullPointer.java
               jxpath/src/java/org/apache/commons/jxpath/ri/model
                        NodePointer.java
               jxpath/src/java/org/apache/commons/jxpath JXPathContext.java
               jxpath/src/java/org/apache/commons/jxpath/ri
                        JXPathContextReferenceImpl.java Compiler.java
               jxpath/src/java/org/apache/commons/jxpath/ri/model/dom
                        DOMNodePointer.java
               jxpath/src/java/org/apache/commons/jxpath/ri/compiler
                        CoreFunction.java
  Added:       jxpath/src/java/org/apache/commons/jxpath KeyManager.java
                        IdentityManager.java
  Log:
  Added support for id() and key()
  
  Revision  Changes    Path
  1.3       +280 -274  jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/parser/XPathParserTokenManager.java
  
  Index: XPathParserTokenManager.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/parser/XPathParserTokenManager.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- XPathParserTokenManager.java	21 Sep 2001 23:22:44 -0000	1.2
  +++ XPathParserTokenManager.java	8 Jun 2002 22:47:24 -0000	1.3
  @@ -10,53 +10,53 @@
      switch (pos)
      {
         case 0:
  -         if ((active1 & 0x3000L) != 0L)
  +         if ((active1 & 0x6000L) != 0L)
               return 11;
  -         if ((active0 & 0xffffffffff800000L) != 0L || (active1 & 0xffL) != 0L)
  +         if ((active0 & 0xffffffffff800000L) != 0L || (active1 & 0x1ffL) != 0L)
            {
  -            jjmatchedKind = 72;
  +            jjmatchedKind = 73;
               return 13;
            }
            return -1;
         case 1:
            if ((active0 & 0x800000800000L) != 0L)
               return 13;
  -         if ((active0 & 0xffff7fffff000000L) != 0L || (active1 & 0xffL) != 0L)
  +         if ((active0 & 0xffff7fffff000000L) != 0L || (active1 & 0x1ffL) != 0L)
            {
  -            jjmatchedKind = 72;
  +            jjmatchedKind = 73;
               jjmatchedPos = 1;
               return 13;
            }
            return -1;
         case 2:
  -         if ((active0 & 0xbfff7ffff8000000L) != 0L || (active1 & 0xefL) != 0L)
  +         if ((active0 & 0x7ffe7ffff8000000L) != 0L || (active1 & 0x1dfL) != 0L)
            {
  -            jjmatchedKind = 72;
  +            jjmatchedKind = 73;
               jjmatchedPos = 2;
               return 13;
            }
  -         if ((active0 & 0x4000000007000000L) != 0L || (active1 & 0x10L) != 0L)
  +         if ((active0 & 0x8001000007000000L) != 0L || (active1 & 0x20L) != 0L)
               return 13;
            return -1;
         case 3:
  -         if ((active0 & 0x8006101018000000L) != 0L || (active1 & 0x6L) != 0L)
  -            return 13;
  -         if ((active0 & 0x3ff96fefe0000000L) != 0L || (active1 & 0xe9L) != 0L)
  +         if ((active0 & 0x7ff26fefe0000000L) != 0L || (active1 & 0x1d2L) != 0L)
            {
               if (jjmatchedPos != 3)
               {
  -               jjmatchedKind = 72;
  +               jjmatchedKind = 73;
                  jjmatchedPos = 3;
               }
               return 13;
            }
  +         if ((active0 & 0xc101018000000L) != 0L || (active1 & 0xdL) != 0L)
  +            return 13;
            return -1;
         case 4:
  -         if ((active0 & 0x400000000000L) != 0L || (active1 & 0xa1L) != 0L)
  +         if ((active0 & 0x400000000000L) != 0L || (active1 & 0x142L) != 0L)
               return 13;
  -         if ((active0 & 0x3ffb2fff60000000L) != 0L || (active1 & 0x48L) != 0L)
  +         if ((active0 & 0x7ff62fff60000000L) != 0L || (active1 & 0x90L) != 0L)
            {
  -            jjmatchedKind = 72;
  +            jjmatchedKind = 73;
               jjmatchedPos = 4;
               return 13;
            }
  @@ -64,172 +64,172 @@
            {
               if (jjmatchedPos < 3)
               {
  -               jjmatchedKind = 72;
  +               jjmatchedKind = 73;
                  jjmatchedPos = 3;
               }
               return -1;
            }
            return -1;
         case 5:
  +         if ((active0 & 0x77c62ffe60000000L) != 0L || (active1 & 0x80L) != 0L)
  +         {
  +            if (jjmatchedPos != 5)
  +            {
  +               jjmatchedKind = 73;
  +               jjmatchedPos = 5;
  +            }
  +            return 13;
  +         }
  +         if ((active0 & 0x830000000000000L) != 0L || (active1 & 0x10L) != 0L)
  +            return 13;
            if ((active0 & 0x100000000L) != 0L)
            {
               if (jjmatchedPos < 4)
               {
  -               jjmatchedKind = 72;
  +               jjmatchedKind = 73;
                  jjmatchedPos = 4;
               }
               return -1;
            }
  -         if ((active0 & 0x418000000000000L) != 0L || (active1 & 0x8L) != 0L)
  -            return 13;
            if ((active0 & 0x80000000L) != 0L)
            {
               if (jjmatchedPos < 3)
               {
  -               jjmatchedKind = 72;
  +               jjmatchedKind = 73;
                  jjmatchedPos = 3;
               }
               return -1;
            }
  -         if ((active0 & 0x3be32ffe60000000L) != 0L || (active1 & 0x40L) != 0L)
  -         {
  -            if (jjmatchedPos != 5)
  -            {
  -               jjmatchedKind = 72;
  -               jjmatchedPos = 5;
  -            }
  -            return 13;
  -         }
            return -1;
         case 6:
  -         if ((active0 & 0x100000000L) != 0L)
  +         if ((active0 & 0x3fc62ffc40000000L) != 0L)
            {
  -            if (jjmatchedPos < 4)
  -            {
  -               jjmatchedKind = 72;
  -               jjmatchedPos = 4;
  -            }
  -            return -1;
  +            jjmatchedKind = 73;
  +            jjmatchedPos = 6;
  +            return 13;
            }
  -         if ((active0 & 0x2000000020000000L) != 0L || (active1 & 0x40L) != 0L)
  +         if ((active0 & 0x4000000020000000L) != 0L || (active1 & 0x80L) != 0L)
               return 13;
            if ((active0 & 0x200000000L) != 0L)
            {
               if (jjmatchedPos < 5)
               {
  -               jjmatchedKind = 72;
  +               jjmatchedKind = 73;
                  jjmatchedPos = 5;
               }
               return -1;
            }
  -         if ((active0 & 0x1fe32ffc40000000L) != 0L)
  +         if ((active0 & 0x100000000L) != 0L)
            {
  -            jjmatchedKind = 72;
  -            jjmatchedPos = 6;
  -            return 13;
  +            if (jjmatchedPos < 4)
  +            {
  +               jjmatchedKind = 73;
  +               jjmatchedPos = 4;
  +            }
  +            return -1;
            }
            return -1;
         case 7:
  -         if ((active0 & 0x40200000000000L) != 0L)
  +         if ((active0 & 0x80200000000000L) != 0L)
               return 13;
  +         if ((active0 & 0x3f460ffc40000000L) != 0L)
  +         {
  +            jjmatchedKind = 73;
  +            jjmatchedPos = 7;
  +            return 13;
  +         }
            if ((active0 & 0x200000000L) != 0L)
            {
               if (jjmatchedPos < 5)
               {
  -               jjmatchedKind = 72;
  +               jjmatchedKind = 73;
                  jjmatchedPos = 5;
               }
               return -1;
            }
  -         if ((active0 & 0x1fa30ffc40000000L) != 0L)
  +         return -1;
  +      case 8:
  +         if ((active0 & 0x18460ff840000000L) != 0L)
            {
  -            jjmatchedKind = 72;
  -            jjmatchedPos = 7;
  +            if (jjmatchedPos != 8)
  +            {
  +               jjmatchedKind = 73;
  +               jjmatchedPos = 8;
  +            }
               return 13;
            }
  -         return -1;
  -      case 8:
  -         if ((active0 & 0x1380000000000000L) != 0L)
  +         if ((active0 & 0x2700000000000000L) != 0L)
               return 13;
            if ((active0 & 0x400000000L) != 0L)
            {
               if (jjmatchedPos < 7)
               {
  -               jjmatchedKind = 72;
  +               jjmatchedKind = 73;
                  jjmatchedPos = 7;
               }
               return -1;
            }
  -         if ((active0 & 0xc230ff840000000L) != 0L)
  +         return -1;
  +      case 9:
  +         if ((active0 & 0x1b440f8040000000L) != 0L)
            {
  -            if (jjmatchedPos != 8)
  -            {
  -               jjmatchedKind = 72;
  -               jjmatchedPos = 8;
  -            }
  +            jjmatchedKind = 73;
  +            jjmatchedPos = 9;
               return 13;
            }
  -         return -1;
  -      case 9:
  +         if ((active0 & 0x2000000000000L) != 0L)
  +            return 13;
            if ((active0 & 0x7800000000L) != 0L)
            {
               if (jjmatchedPos < 8)
               {
  -               jjmatchedKind = 72;
  +               jjmatchedKind = 73;
                  jjmatchedPos = 8;
               }
               return -1;
            }
  -         if ((active0 & 0x1000000000000L) != 0L)
  -            return 13;
  -         if ((active0 & 0xda20f8040000000L) != 0L)
  -         {
  -            jjmatchedKind = 72;
  -            jjmatchedPos = 9;
  -            return 13;
  -         }
            if ((active0 & 0x400000000L) != 0L)
            {
               if (jjmatchedPos < 7)
               {
  -               jjmatchedKind = 72;
  +               jjmatchedKind = 73;
                  jjmatchedPos = 7;
               }
               return -1;
            }
            return -1;
         case 10:
  +         if ((active0 & 0x40000000000000L) != 0L)
  +            return 13;
  +         if ((active0 & 0x8000000000L) != 0L)
  +         {
  +            if (jjmatchedPos < 9)
  +            {
  +               jjmatchedKind = 73;
  +               jjmatchedPos = 9;
  +            }
  +            return -1;
  +         }
            if ((active0 & 0x7800000000L) != 0L)
            {
               if (jjmatchedPos < 8)
               {
  -               jjmatchedKind = 72;
  +               jjmatchedKind = 73;
                  jjmatchedPos = 8;
               }
               return -1;
            }
  -         if ((active0 & 0x20000000000000L) != 0L)
  -            return 13;
  -         if ((active0 & 0xd820f0040000000L) != 0L)
  +         if ((active0 & 0x1b040f0040000000L) != 0L)
            {
  -            jjmatchedKind = 72;
  +            jjmatchedKind = 73;
               jjmatchedPos = 10;
               return 13;
            }
  -         if ((active0 & 0x8000000000L) != 0L)
  -         {
  -            if (jjmatchedPos < 9)
  -            {
  -               jjmatchedKind = 72;
  -               jjmatchedPos = 9;
  -            }
  -            return -1;
  -         }
            return -1;
         case 11:
  -         if ((active0 & 0xd820f0040000000L) != 0L)
  +         if ((active0 & 0x1b040f0040000000L) != 0L)
            {
  -            jjmatchedKind = 72;
  +            jjmatchedKind = 73;
               jjmatchedPos = 11;
               return 13;
            }
  @@ -237,89 +237,89 @@
            {
               if (jjmatchedPos < 9)
               {
  -               jjmatchedKind = 72;
  +               jjmatchedKind = 73;
                  jjmatchedPos = 9;
               }
               return -1;
            }
            return -1;
         case 12:
  -         if ((active0 & 0x402000000000000L) != 0L)
  -            return 13;
  -         if ((active0 & 0x9800f0040000000L) != 0L)
  +         if ((active0 & 0x13000f0040000000L) != 0L)
            {
  -            jjmatchedKind = 72;
  +            jjmatchedKind = 73;
               jjmatchedPos = 12;
               return 13;
            }
  +         if ((active0 & 0x804000000000000L) != 0L)
  +            return 13;
            return -1;
         case 13:
  -         if ((active0 & 0x9800f0040000000L) != 0L)
  +         if ((active0 & 0x13000f0040000000L) != 0L)
            {
  -            jjmatchedKind = 72;
  +            jjmatchedKind = 73;
               jjmatchedPos = 13;
               return 13;
            }
            return -1;
         case 14:
  -         if ((active0 & 0x900000000000000L) != 0L)
  -            return 13;
  -         if ((active0 & 0x800f0040000000L) != 0L)
  +         if ((active0 & 0x1000f0040000000L) != 0L)
            {
  -            jjmatchedKind = 72;
  +            jjmatchedKind = 73;
               jjmatchedPos = 14;
               return 13;
            }
  +         if ((active0 & 0x1200000000000000L) != 0L)
  +            return 13;
            return -1;
         case 15:
  -         if ((active0 & 0x80000000000000L) != 0L)
  -            return 13;
            if ((active0 & 0xf0040000000L) != 0L)
            {
  -            jjmatchedKind = 72;
  +            jjmatchedKind = 73;
               jjmatchedPos = 15;
               return 13;
            }
  +         if ((active0 & 0x100000000000000L) != 0L)
  +            return 13;
            return -1;
         case 16:
            if ((active0 & 0x10000000000L) != 0L)
            {
               if (jjmatchedPos < 15)
               {
  -               jjmatchedKind = 72;
  +               jjmatchedKind = 73;
                  jjmatchedPos = 15;
               }
               return -1;
            }
            if ((active0 & 0xe0040000000L) != 0L)
            {
  -            jjmatchedKind = 72;
  +            jjmatchedKind = 73;
               jjmatchedPos = 16;
               return 13;
            }
            return -1;
         case 17:
  -         if ((active0 & 0x10000000000L) != 0L)
  +         if ((active0 & 0x60000000000L) != 0L)
            {
  -            if (jjmatchedPos < 15)
  +            if (jjmatchedPos < 16)
               {
  -               jjmatchedKind = 72;
  -               jjmatchedPos = 15;
  +               jjmatchedKind = 73;
  +               jjmatchedPos = 16;
               }
               return -1;
            }
  -         if ((active0 & 0x60000000000L) != 0L)
  +         if ((active0 & 0x10000000000L) != 0L)
            {
  -            if (jjmatchedPos < 16)
  +            if (jjmatchedPos < 15)
               {
  -               jjmatchedKind = 72;
  -               jjmatchedPos = 16;
  +               jjmatchedKind = 73;
  +               jjmatchedPos = 15;
               }
               return -1;
            }
            if ((active0 & 0x80040000000L) != 0L)
            {
  -            jjmatchedKind = 72;
  +            jjmatchedKind = 73;
               jjmatchedPos = 17;
               return 13;
            }
  @@ -329,14 +329,14 @@
            {
               if (jjmatchedPos < 16)
               {
  -               jjmatchedKind = 72;
  +               jjmatchedKind = 73;
                  jjmatchedPos = 16;
               }
               return -1;
            }
            if ((active0 & 0x40000000L) != 0L)
            {
  -            jjmatchedKind = 72;
  +            jjmatchedKind = 73;
               jjmatchedPos = 18;
               return 13;
            }
  @@ -344,7 +344,7 @@
            {
               if (jjmatchedPos < 17)
               {
  -               jjmatchedKind = 72;
  +               jjmatchedKind = 73;
                  jjmatchedPos = 17;
               }
               return -1;
  @@ -353,7 +353,7 @@
         case 19:
            if ((active0 & 0x40000000L) != 0L)
            {
  -            jjmatchedKind = 72;
  +            jjmatchedKind = 73;
               jjmatchedPos = 19;
               return 13;
            }
  @@ -361,7 +361,7 @@
            {
               if (jjmatchedPos < 17)
               {
  -               jjmatchedKind = 72;
  +               jjmatchedKind = 73;
                  jjmatchedPos = 17;
               }
               return -1;
  @@ -370,7 +370,7 @@
         case 20:
            if ((active0 & 0x40000000L) != 0L)
            {
  -            jjmatchedKind = 72;
  +            jjmatchedKind = 73;
               jjmatchedPos = 20;
               return 13;
            }
  @@ -406,25 +406,25 @@
         case 36:
            return jjStopAtPos(0, 13);
         case 40:
  -         return jjStopAtPos(0, 74);
  -      case 41:
            return jjStopAtPos(0, 75);
  +      case 41:
  +         return jjStopAtPos(0, 76);
         case 42:
  -         return jjStopAtPos(0, 82);
  +         return jjStopAtPos(0, 83);
         case 43:
            return jjStopAtPos(0, 5);
         case 44:
  -         return jjStopAtPos(0, 81);
  +         return jjStopAtPos(0, 82);
         case 45:
            return jjStopAtPos(0, 6);
         case 46:
  -         jjmatchedKind = 76;
  -         return jjMoveStringLiteralDfa1_0(0x0L, 0x2000L);
  +         jjmatchedKind = 77;
  +         return jjMoveStringLiteralDfa1_0(0x0L, 0x4000L);
         case 47:
            jjmatchedKind = 2;
            return jjMoveStringLiteralDfa1_0(0x8L, 0x0L);
         case 58:
  -         return jjStopAtPos(0, 73);
  +         return jjStopAtPos(0, 74);
         case 60:
            jjmatchedKind = 9;
            return jjMoveStringLiteralDfa1_0(0x400L, 0x0L);
  @@ -434,39 +434,41 @@
            jjmatchedKind = 11;
            return jjMoveStringLiteralDfa1_0(0x1000L, 0x0L);
         case 64:
  -         return jjStopAtPos(0, 80);
  +         return jjStopAtPos(0, 81);
         case 91:
  -         return jjStopAtPos(0, 78);
  -      case 93:
            return jjStopAtPos(0, 79);
  +      case 93:
  +         return jjStopAtPos(0, 80);
         case 97:
            return jjMoveStringLiteralDfa1_0(0x10c01000000L, 0x0L);
         case 98:
  -         return jjMoveStringLiteralDfa1_0(0x2000000000000000L, 0x0L);
  +         return jjMoveStringLiteralDfa1_0(0x4000000000000000L, 0x0L);
         case 99:
  -         return jjMoveStringLiteralDfa1_0(0x50400120000000L, 0x40L);
  +         return jjMoveStringLiteralDfa1_0(0xa0400120000000L, 0x80L);
         case 100:
            return jjMoveStringLiteralDfa1_0(0x88004000000L, 0x0L);
         case 102:
  -         return jjMoveStringLiteralDfa1_0(0x24000000000L, 0x21L);
  +         return jjMoveStringLiteralDfa1_0(0x24000000000L, 0x42L);
         case 105:
            return jjMoveStringLiteralDfa1_0(0x800000000000L, 0x0L);
  +      case 107:
  +         return jjMoveStringLiteralDfa1_0(0x1000000000000L, 0x0L);
         case 108:
  -         return jjMoveStringLiteralDfa1_0(0x1100000000000L, 0x4L);
  +         return jjMoveStringLiteralDfa1_0(0x2100000000000L, 0x8L);
         case 109:
            return jjMoveStringLiteralDfa1_0(0x2000000L, 0x0L);
         case 110:
  -         return jjMoveStringLiteralDfa1_0(0x4806001008000000L, 0xaL);
  +         return jjMoveStringLiteralDfa1_0(0x900c001008000000L, 0x14L);
         case 111:
            return jjMoveStringLiteralDfa1_0(0x800000L, 0x0L);
         case 112:
            return jjMoveStringLiteralDfa1_0(0x242240000000L, 0x0L);
         case 114:
  -         return jjMoveStringLiteralDfa1_0(0x0L, 0x80L);
  +         return jjMoveStringLiteralDfa1_0(0x0L, 0x100L);
         case 115:
  -         return jjMoveStringLiteralDfa1_0(0x7a8000080000000L, 0x10L);
  +         return jjMoveStringLiteralDfa1_0(0xf50000080000000L, 0x20L);
         case 116:
  -         return jjMoveStringLiteralDfa1_0(0x9000000010000000L, 0x0L);
  +         return jjMoveStringLiteralDfa1_0(0x2000000010000000L, 0x1L);
         case 124:
            return jjStopAtPos(0, 4);
         default :
  @@ -483,8 +485,8 @@
      switch(curChar)
      {
         case 46:
  -         if ((active1 & 0x2000L) != 0L)
  -            return jjStopAtPos(1, 77);
  +         if ((active1 & 0x4000L) != 0L)
  +            return jjStopAtPos(1, 78);
            break;
         case 47:
            if ((active0 & 0x8L) != 0L)
  @@ -499,31 +501,31 @@
               return jjStopAtPos(1, 12);
            break;
         case 97:
  -         return jjMoveStringLiteralDfa2_0(active0, 0x6101200000000L, active1, 0x5L);
  +         return jjMoveStringLiteralDfa2_0(active0, 0xc101200000000L, active1, 0xaL);
         case 100:
            if ((active0 & 0x800000000000L) != 0L)
               return jjStartNfaWithStates_0(1, 47, 13);
            break;
         case 101:
  -         return jjMoveStringLiteralDfa2_0(active0, 0x88090000000L, active1, 0x40L);
  +         return jjMoveStringLiteralDfa2_0(active0, 0x1088090000000L, active1, 0x80L);
         case 104:
            return jjMoveStringLiteralDfa2_0(active0, 0x100000000L, active1, 0L);
         case 105:
            return jjMoveStringLiteralDfa2_0(active0, 0x4000000L, active1, 0L);
         case 108:
  -         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x20L);
  +         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x40L);
         case 110:
            return jjMoveStringLiteralDfa2_0(active0, 0x10401000000L, active1, 0L);
         case 111:
  -         return jjMoveStringLiteralDfa2_0(active0, 0x685162402a000000L, active1, 0x80L);
  +         return jjMoveStringLiteralDfa2_0(active0, 0xd0a262402a000000L, active1, 0x100L);
         case 114:
            if ((active0 & 0x800000L) != 0L)
               return jjStartNfaWithStates_0(1, 23, 13);
  -         return jjMoveStringLiteralDfa2_0(active0, 0x9000042040000000L, active1, 0L);
  +         return jjMoveStringLiteralDfa2_0(active0, 0x2000042040000000L, active1, 0x1L);
         case 116:
  -         return jjMoveStringLiteralDfa2_0(active0, 0x428000800000000L, active1, 0L);
  +         return jjMoveStringLiteralDfa2_0(active0, 0x850000800000000L, active1, 0L);
         case 117:
  -         return jjMoveStringLiteralDfa2_0(active0, 0x380000000000000L, active1, 0x1aL);
  +         return jjMoveStringLiteralDfa2_0(active0, 0x700000000000000L, active1, 0x34L);
         default :
            break;
      }
  @@ -541,11 +543,11 @@
      switch(curChar)
      {
         case 97:
  -         return jjMoveStringLiteralDfa3_0(active0, 0x1020000000000000L, active1, 0L);
  +         return jjMoveStringLiteralDfa3_0(active0, 0x2040000000000000L, active1, 0L);
         case 98:
  -         return jjMoveStringLiteralDfa3_0(active0, 0x380000000000000L, active1, 0L);
  +         return jjMoveStringLiteralDfa3_0(active0, 0x700000000000000L, active1, 0L);
         case 99:
  -         return jjMoveStringLiteralDfa3_0(active0, 0x1010400000000L, active1, 0L);
  +         return jjMoveStringLiteralDfa3_0(active0, 0x2010400000000L, active1, 0L);
         case 100:
            if ((active0 & 0x1000000L) != 0L)
               return jjStartNfaWithStates_0(2, 24, 13);
  @@ -555,33 +557,37 @@
         case 101:
            return jjMoveStringLiteralDfa3_0(active0, 0x42000000000L, active1, 0L);
         case 105:
  -         return jjMoveStringLiteralDfa3_0(active0, 0x100000000L, active1, 0x40L);
  +         return jjMoveStringLiteralDfa3_0(active0, 0x100000000L, active1, 0x80L);
         case 108:
  -         return jjMoveStringLiteralDfa3_0(active0, 0x24080000000L, active1, 0x3L);
  +         return jjMoveStringLiteralDfa3_0(active0, 0x24080000000L, active1, 0x6L);
         case 109:
  -         if ((active1 & 0x10L) != 0L)
  -            return jjStartNfaWithStates_0(2, 68, 13);
  -         return jjMoveStringLiteralDfa3_0(active0, 0x6001020000000L, active1, 0x8L);
  +         if ((active1 & 0x20L) != 0L)
  +            return jjStartNfaWithStates_0(2, 69, 13);
  +         return jjMoveStringLiteralDfa3_0(active0, 0xc001020000000L, active1, 0x10L);
         case 110:
  -         return jjMoveStringLiteralDfa3_0(active0, 0x50000000000000L, active1, 0x4L);
  +         return jjMoveStringLiteralDfa3_0(active0, 0xa0000000000000L, active1, 0x8L);
         case 111:
  -         return jjMoveStringLiteralDfa3_0(active0, 0x2000000040000000L, active1, 0x20L);
  +         return jjMoveStringLiteralDfa3_0(active0, 0x4000000040000000L, active1, 0x40L);
         case 114:
  -         return jjMoveStringLiteralDfa3_0(active0, 0xc08000200000000L, active1, 0L);
  +         return jjMoveStringLiteralDfa3_0(active0, 0x1810000200000000L, active1, 0L);
         case 115:
            return jjMoveStringLiteralDfa3_0(active0, 0x388000000000L, active1, 0L);
         case 116:
  -         if ((active0 & 0x4000000000000000L) != 0L)
  -            return jjStartNfaWithStates_0(2, 62, 13);
  +         if ((active0 & 0x8000000000000000L) != 0L)
  +            return jjStartNfaWithStates_0(2, 63, 13);
            return jjMoveStringLiteralDfa3_0(active0, 0x800000000L, active1, 0L);
         case 117:
  -         return jjMoveStringLiteralDfa3_0(active0, 0x8000400000000000L, active1, 0x80L);
  +         return jjMoveStringLiteralDfa3_0(active0, 0x400000000000L, active1, 0x101L);
         case 118:
            if ((active0 & 0x4000000L) != 0L)
               return jjStartNfaWithStates_0(2, 26, 13);
            break;
         case 120:
            return jjMoveStringLiteralDfa3_0(active0, 0x10000000L, active1, 0L);
  +      case 121:
  +         if ((active0 & 0x1000000000000L) != 0L)
  +            return jjStartNfaWithStates_0(2, 48, 13);
  +         break;
         default :
            break;
      }
  @@ -599,50 +605,50 @@
      switch(curChar)
      {
         case 97:
  -         return jjMoveStringLiteralDfa4_0(active0, 0x1000000000000L, active1, 0L);
  +         return jjMoveStringLiteralDfa4_0(active0, 0x2000000000000L, active1, 0L);
         case 98:
  -         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x8L);
  +         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x10L);
         case 99:
  -         return jjMoveStringLiteralDfa4_0(active0, 0x100ca040000000L, active1, 0L);
  +         return jjMoveStringLiteralDfa4_0(active0, 0x200ca040000000L, active1, 0L);
         case 101:
            if ((active0 & 0x8000000L) != 0L)
               return jjStartNfaWithStates_0(3, 27, 13);
  -         else if ((active0 & 0x4000000000000L) != 0L)
  +         else if ((active0 & 0x8000000000000L) != 0L)
            {
  -            jjmatchedKind = 50;
  +            jjmatchedKind = 51;
               jjmatchedPos = 3;
            }
  -         else if ((active0 & 0x8000000000000000L) != 0L)
  -            return jjStartNfaWithStates_0(3, 63, 13);
  -         return jjMoveStringLiteralDfa4_0(active0, 0x2011600000000L, active1, 0L);
  +         else if ((active1 & 0x1L) != 0L)
  +            return jjStartNfaWithStates_0(3, 64, 13);
  +         return jjMoveStringLiteralDfa4_0(active0, 0x4011600000000L, active1, 0L);
         case 102:
            return jjMoveStringLiteralDfa4_0(active0, 0x80000000L, active1, 0L);
         case 103:
  -         if ((active1 & 0x4L) != 0L)
  -            return jjStartNfaWithStates_0(3, 66, 13);
  +         if ((active1 & 0x8L) != 0L)
  +            return jjStartNfaWithStates_0(3, 67, 13);
            break;
         case 105:
  -         return jjMoveStringLiteralDfa4_0(active0, 0x408200000000000L, active1, 0L);
  +         return jjMoveStringLiteralDfa4_0(active0, 0x810200000000000L, active1, 0L);
         case 108:
  -         if ((active1 & 0x2L) != 0L)
  -            return jjStartNfaWithStates_0(3, 65, 13);
  -         return jjMoveStringLiteralDfa4_0(active0, 0x2000024100000000L, active1, 0x40L);
  +         if ((active1 & 0x4L) != 0L)
  +            return jjStartNfaWithStates_0(3, 66, 13);
  +         return jjMoveStringLiteralDfa4_0(active0, 0x4000024100000000L, active1, 0x80L);
         case 109:
  -         return jjMoveStringLiteralDfa4_0(active0, 0x800000020000000L, active1, 0L);
  +         return jjMoveStringLiteralDfa4_0(active0, 0x1000000020000000L, active1, 0L);
         case 110:
  -         return jjMoveStringLiteralDfa4_0(active0, 0x1000400000000000L, active1, 0x80L);
  +         return jjMoveStringLiteralDfa4_0(active0, 0x2000400000000000L, active1, 0x100L);
         case 111:
  -         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x20L);
  +         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x40L);
         case 114:
  -         return jjMoveStringLiteralDfa4_0(active0, 0x20000800000000L, active1, 0L);
  +         return jjMoveStringLiteralDfa4_0(active0, 0x40000800000000L, active1, 0L);
         case 115:
  -         return jjMoveStringLiteralDfa4_0(active0, 0x380000000000000L, active1, 0x1L);
  +         return jjMoveStringLiteralDfa4_0(active0, 0x700000000000000L, active1, 0x2L);
         case 116:
            if ((active0 & 0x10000000L) != 0L)
               return jjStartNfaWithStates_0(3, 28, 13);
            else if ((active0 & 0x100000000000L) != 0L)
               return jjStartNfaWithStates_0(3, 44, 13);
  -         return jjMoveStringLiteralDfa4_0(active0, 0x40000000000000L, active1, 0L);
  +         return jjMoveStringLiteralDfa4_0(active0, 0x80000000000000L, active1, 0L);
         default :
            break;
      }
  @@ -662,33 +668,33 @@
         case 58:
            return jjMoveStringLiteralDfa5_0(active0, 0x80000000L, active1, 0L);
         case 97:
  -         return jjMoveStringLiteralDfa5_0(active0, 0x850000000000000L, active1, 0L);
  +         return jjMoveStringLiteralDfa5_0(active0, 0x10a0000000000000L, active1, 0L);
         case 100:
  -         if ((active1 & 0x80L) != 0L)
  -            return jjStartNfaWithStates_0(4, 71, 13);
  +         if ((active1 & 0x100L) != 0L)
  +            return jjStartNfaWithStates_0(4, 72, 13);
            return jjMoveStringLiteralDfa5_0(active0, 0x100000000L, active1, 0L);
         case 101:
  -         if ((active1 & 0x1L) != 0L)
  -            return jjStartNfaWithStates_0(4, 64, 13);
  -         return jjMoveStringLiteralDfa5_0(active0, 0x20000ca060000000L, active1, 0x8L);
  +         if ((active1 & 0x2L) != 0L)
  +            return jjStartNfaWithStates_0(4, 65, 13);
  +         return jjMoveStringLiteralDfa5_0(active0, 0x40000ca060000000L, active1, 0x10L);
         case 105:
  -         return jjMoveStringLiteralDfa5_0(active0, 0x800000000L, active1, 0x40L);
  +         return jjMoveStringLiteralDfa5_0(active0, 0x800000000L, active1, 0x80L);
         case 108:
  -         return jjMoveStringLiteralDfa5_0(active0, 0x1000000000000L, active1, 0L);
  +         return jjMoveStringLiteralDfa5_0(active0, 0x2000000000000L, active1, 0L);
         case 110:
  -         return jjMoveStringLiteralDfa5_0(active0, 0x408000200000000L, active1, 0L);
  +         return jjMoveStringLiteralDfa5_0(active0, 0x810000200000000L, active1, 0L);
         case 111:
            return jjMoveStringLiteralDfa5_0(active0, 0x24000000000L, active1, 0L);
         case 114:
  -         if ((active1 & 0x20L) != 0L)
  -            return jjStartNfaWithStates_0(4, 69, 13);
  +         if ((active1 & 0x40L) != 0L)
  +            return jjStartNfaWithStates_0(4, 70, 13);
            break;
         case 115:
  -         return jjMoveStringLiteralDfa5_0(active0, 0x1002011400000000L, active1, 0L);
  +         return jjMoveStringLiteralDfa5_0(active0, 0x2004011400000000L, active1, 0L);
         case 116:
            if ((active0 & 0x400000000000L) != 0L)
               return jjStartNfaWithStates_0(4, 46, 13);
  -         return jjMoveStringLiteralDfa5_0(active0, 0x3a0200000000000L, active1, 0L);
  +         return jjMoveStringLiteralDfa5_0(active0, 0x740200000000000L, active1, 0L);
         default :
            break;
      }
  @@ -706,41 +712,41 @@
      switch(curChar)
      {
         case 45:
  -         return jjMoveStringLiteralDfa6_0(active0, 0x1000000000000L, active1, 0L);
  +         return jjMoveStringLiteralDfa6_0(active0, 0x2000000000000L, active1, 0L);
         case 58:
            if ((active0 & 0x80000000L) != 0L)
               return jjStopAtPos(5, 31);
            return jjMoveStringLiteralDfa6_0(active0, 0x100000000L, active1, 0L);
         case 97:
  -         return jjMoveStringLiteralDfa6_0(active0, 0x2000000000000000L, active1, 0L);
  +         return jjMoveStringLiteralDfa6_0(active0, 0x4000000000000000L, active1, 0L);
         case 98:
            return jjMoveStringLiteralDfa6_0(active0, 0x800000000L, active1, 0L);
         case 100:
            return jjMoveStringLiteralDfa6_0(active0, 0x42000000000L, active1, 0L);
         case 103:
  -         if ((active0 & 0x8000000000000L) != 0L)
  +         if ((active0 & 0x10000000000000L) != 0L)
            {
  -            jjmatchedKind = 51;
  +            jjmatchedKind = 52;
               jjmatchedPos = 5;
            }
  -         return jjMoveStringLiteralDfa6_0(active0, 0x400000000000000L, active1, 0L);
  +         return jjMoveStringLiteralDfa6_0(active0, 0x800000000000000L, active1, 0L);
         case 105:
  -         return jjMoveStringLiteralDfa6_0(active0, 0x40200000000000L, active1, 0L);
  +         return jjMoveStringLiteralDfa6_0(active0, 0x80200000000000L, active1, 0L);
         case 108:
  -         return jjMoveStringLiteralDfa6_0(active0, 0x1800000000000000L, active1, 0L);
  +         return jjMoveStringLiteralDfa6_0(active0, 0x3000000000000000L, active1, 0L);
         case 110:
  -         return jjMoveStringLiteralDfa6_0(active0, 0x88020000000L, active1, 0x40L);
  +         return jjMoveStringLiteralDfa6_0(active0, 0x88020000000L, active1, 0x80L);
         case 112:
  -         return jjMoveStringLiteralDfa6_0(active0, 0x2001000000000L, active1, 0L);
  +         return jjMoveStringLiteralDfa6_0(active0, 0x4001000000000L, active1, 0L);
         case 114:
  -         if ((active1 & 0x8L) != 0L)
  -            return jjStartNfaWithStates_0(5, 67, 13);
  -         return jjMoveStringLiteralDfa6_0(active0, 0x380000000000000L, active1, 0L);
  +         if ((active1 & 0x10L) != 0L)
  +            return jjStartNfaWithStates_0(5, 68, 13);
  +         return jjMoveStringLiteralDfa6_0(active0, 0x700000000000000L, active1, 0L);
         case 115:
  -         return jjMoveStringLiteralDfa6_0(active0, 0x20000040000000L, active1, 0L);
  +         return jjMoveStringLiteralDfa6_0(active0, 0x40000040000000L, active1, 0L);
         case 116:
  -         if ((active0 & 0x10000000000000L) != 0L)
  -            return jjStartNfaWithStates_0(5, 52, 13);
  +         if ((active0 & 0x20000000000000L) != 0L)
  +            return jjStartNfaWithStates_0(5, 53, 13);
            return jjMoveStringLiteralDfa6_0(active0, 0x10600000000L, active1, 0L);
         case 119:
            return jjMoveStringLiteralDfa6_0(active0, 0x24000000000L, active1, 0L);
  @@ -761,25 +767,25 @@
      switch(curChar)
      {
         case 45:
  -         return jjMoveStringLiteralDfa7_0(active0, 0x420000000000000L, active1, 0L);
  +         return jjMoveStringLiteralDfa7_0(active0, 0x840000000000000L, active1, 0L);
         case 58:
            if ((active0 & 0x100000000L) != 0L)
               return jjStopAtPos(6, 32);
            return jjMoveStringLiteralDfa7_0(active0, 0x200000000L, active1, 0L);
         case 97:
  -         return jjMoveStringLiteralDfa7_0(active0, 0x1002001000000000L, active1, 0L);
  +         return jjMoveStringLiteralDfa7_0(active0, 0x2004001000000000L, active1, 0L);
         case 100:
            return jjMoveStringLiteralDfa7_0(active0, 0x88000000000L, active1, 0L);
         case 103:
  -         if ((active1 & 0x40L) != 0L)
  -            return jjStartNfaWithStates_0(6, 70, 13);
  +         if ((active1 & 0x80L) != 0L)
  +            return jjStartNfaWithStates_0(6, 71, 13);
            break;
         case 105:
  -         return jjMoveStringLiteralDfa7_0(active0, 0xb80066000000000L, active1, 0L);
  +         return jjMoveStringLiteralDfa7_0(active0, 0x1700066000000000L, active1, 0L);
         case 110:
  -         if ((active0 & 0x2000000000000000L) != 0L)
  -            return jjStartNfaWithStates_0(6, 61, 13);
  -         return jjMoveStringLiteralDfa7_0(active0, 0x41000000000000L, active1, 0L);
  +         if ((active0 & 0x4000000000000000L) != 0L)
  +            return jjStartNfaWithStates_0(6, 62, 13);
  +         return jjMoveStringLiteralDfa7_0(active0, 0x82000000000000L, active1, 0L);
         case 111:
            return jjMoveStringLiteralDfa7_0(active0, 0x210400000000L, active1, 0L);
         case 115:
  @@ -811,29 +817,29 @@
               return jjStopAtPos(7, 33);
            break;
         case 97:
  -         return jjMoveStringLiteralDfa8_0(active0, 0x1088000000000L);
  +         return jjMoveStringLiteralDfa8_0(active0, 0x2088000000000L);
         case 99:
  -         return jjMoveStringLiteralDfa8_0(active0, 0x2001000000000L);
  +         return jjMoveStringLiteralDfa8_0(active0, 0x4001000000000L);
         case 105:
            return jjMoveStringLiteralDfa8_0(active0, 0x40000000L);
         case 108:
  -         return jjMoveStringLiteralDfa8_0(active0, 0x400000000000000L);
  +         return jjMoveStringLiteralDfa8_0(active0, 0x800000000000000L);
         case 110:
            if ((active0 & 0x200000000000L) != 0L)
               return jjStartNfaWithStates_0(7, 45, 13);
  -         return jjMoveStringLiteralDfa8_0(active0, 0x380066000000000L);
  +         return jjMoveStringLiteralDfa8_0(active0, 0x700066000000000L);
         case 114:
            return jjMoveStringLiteralDfa8_0(active0, 0x10400000000L);
         case 115:
  -         if ((active0 & 0x40000000000000L) != 0L)
  -            return jjStartNfaWithStates_0(7, 54, 13);
  +         if ((active0 & 0x80000000000000L) != 0L)
  +            return jjStartNfaWithStates_0(7, 55, 13);
            break;
         case 116:
  -         return jjMoveStringLiteralDfa8_0(active0, 0x1000000800000000L);
  +         return jjMoveStringLiteralDfa8_0(active0, 0x2000000800000000L);
         case 119:
  -         return jjMoveStringLiteralDfa8_0(active0, 0x20000000000000L);
  +         return jjMoveStringLiteralDfa8_0(active0, 0x40000000000000L);
         case 122:
  -         return jjMoveStringLiteralDfa8_0(active0, 0x800000000000000L);
  +         return jjMoveStringLiteralDfa8_0(active0, 0x1000000000000000L);
         default :
            break;
      }
  @@ -855,20 +861,20 @@
         case 58:
            return jjMoveStringLiteralDfa9_0(active0, 0x400000000L);
         case 101:
  -         if ((active0 & 0x1000000000000000L) != 0L)
  -            return jjStartNfaWithStates_0(8, 60, 13);
  -         return jjMoveStringLiteralDfa9_0(active0, 0xc02001800000000L);
  +         if ((active0 & 0x2000000000000000L) != 0L)
  +            return jjStartNfaWithStates_0(8, 61, 13);
  +         return jjMoveStringLiteralDfa9_0(active0, 0x1804001800000000L);
         case 103:
  -         if ((active0 & 0x200000000000000L) != 0L)
  +         if ((active0 & 0x400000000000000L) != 0L)
            {
  -            jjmatchedKind = 57;
  +            jjmatchedKind = 58;
               jjmatchedPos = 8;
            }
  -         return jjMoveStringLiteralDfa9_0(active0, 0x180066000000000L);
  +         return jjMoveStringLiteralDfa9_0(active0, 0x300066000000000L);
         case 105:
  -         return jjMoveStringLiteralDfa9_0(active0, 0x20000000000000L);
  +         return jjMoveStringLiteralDfa9_0(active0, 0x40000000000000L);
         case 109:
  -         return jjMoveStringLiteralDfa9_0(active0, 0x1000000000000L);
  +         return jjMoveStringLiteralDfa9_0(active0, 0x2000000000000L);
         case 110:
            return jjMoveStringLiteralDfa9_0(active0, 0x88040000000L);
         default :
  @@ -888,23 +894,23 @@
      switch(curChar)
      {
         case 45:
  -         return jjMoveStringLiteralDfa10_0(active0, 0x982060000000000L);
  +         return jjMoveStringLiteralDfa10_0(active0, 0x1304060000000000L);
         case 58:
            if ((active0 & 0x400000000L) != 0L)
               return jjStopAtPos(9, 34);
            return jjMoveStringLiteralDfa10_0(active0, 0x7800000000L);
         case 101:
  -         if ((active0 & 0x1000000000000L) != 0L)
  -            return jjStartNfaWithStates_0(9, 48, 13);
  +         if ((active0 & 0x2000000000000L) != 0L)
  +            return jjStartNfaWithStates_0(9, 49, 13);
            break;
         case 103:
            return jjMoveStringLiteralDfa10_0(active0, 0x40000000L);
         case 110:
  -         return jjMoveStringLiteralDfa10_0(active0, 0x400000000000000L);
  +         return jjMoveStringLiteralDfa10_0(active0, 0x800000000000000L);
         case 111:
            return jjMoveStringLiteralDfa10_0(active0, 0x10000000000L);
         case 116:
  -         return jjMoveStringLiteralDfa10_0(active0, 0x20088000000000L);
  +         return jjMoveStringLiteralDfa10_0(active0, 0x40088000000000L);
         default :
            break;
      }
  @@ -934,21 +940,21 @@
               return jjStopAtPos(10, 38);
            return jjMoveStringLiteralDfa11_0(active0, 0x8000000000L);
         case 97:
  -         return jjMoveStringLiteralDfa11_0(active0, 0x100000000000000L);
  +         return jjMoveStringLiteralDfa11_0(active0, 0x200000000000000L);
         case 98:
  -         return jjMoveStringLiteralDfa11_0(active0, 0x80000000000000L);
  +         return jjMoveStringLiteralDfa11_0(active0, 0x100000000000000L);
         case 103:
  -         return jjMoveStringLiteralDfa11_0(active0, 0x400000000000000L);
  +         return jjMoveStringLiteralDfa11_0(active0, 0x800000000000000L);
         case 104:
  -         if ((active0 & 0x20000000000000L) != 0L)
  -            return jjStartNfaWithStates_0(10, 53, 13);
  +         if ((active0 & 0x40000000000000L) != 0L)
  +            return jjStartNfaWithStates_0(10, 54, 13);
            break;
         case 114:
            return jjMoveStringLiteralDfa11_0(active0, 0x10000000000L);
         case 115:
  -         return jjMoveStringLiteralDfa11_0(active0, 0x800060000000000L);
  +         return jjMoveStringLiteralDfa11_0(active0, 0x1000060000000000L);
         case 117:
  -         return jjMoveStringLiteralDfa11_0(active0, 0x2000000000000L);
  +         return jjMoveStringLiteralDfa11_0(active0, 0x4000000000000L);
         default :
            break;
      }
  @@ -972,19 +978,19 @@
               return jjStopAtPos(11, 39);
            break;
         case 101:
  -         return jjMoveStringLiteralDfa12_0(active0, 0x80000000000000L);
  -      case 102:
            return jjMoveStringLiteralDfa12_0(active0, 0x100000000000000L);
  +      case 102:
  +         return jjMoveStringLiteralDfa12_0(active0, 0x200000000000000L);
         case 105:
            return jjMoveStringLiteralDfa12_0(active0, 0x60040000000L);
         case 111:
            return jjMoveStringLiteralDfa12_0(active0, 0x80000000000L);
         case 112:
  -         return jjMoveStringLiteralDfa12_0(active0, 0x800000000000000L);
  +         return jjMoveStringLiteralDfa12_0(active0, 0x1000000000000000L);
         case 114:
  -         return jjMoveStringLiteralDfa12_0(active0, 0x2000000000000L);
  +         return jjMoveStringLiteralDfa12_0(active0, 0x4000000000000L);
         case 116:
  -         return jjMoveStringLiteralDfa12_0(active0, 0x400000000000000L);
  +         return jjMoveStringLiteralDfa12_0(active0, 0x800000000000000L);
         default :
            break;
      }
  @@ -1002,18 +1008,18 @@
      switch(curChar)
      {
         case 97:
  -         return jjMoveStringLiteralDfa13_0(active0, 0x800000000000000L);
  +         return jjMoveStringLiteralDfa13_0(active0, 0x1000000000000000L);
         case 98:
            return jjMoveStringLiteralDfa13_0(active0, 0x60000000000L);
         case 102:
  -         return jjMoveStringLiteralDfa13_0(active0, 0x80000000000000L);
  +         return jjMoveStringLiteralDfa13_0(active0, 0x100000000000000L);
         case 104:
  -         if ((active0 & 0x400000000000000L) != 0L)
  -            return jjStartNfaWithStates_0(12, 58, 13);
  +         if ((active0 & 0x800000000000000L) != 0L)
  +            return jjStartNfaWithStates_0(12, 59, 13);
            break;
         case 105:
  -         if ((active0 & 0x2000000000000L) != 0L)
  -            return jjStartNfaWithStates_0(12, 49, 13);
  +         if ((active0 & 0x4000000000000L) != 0L)
  +            return jjStartNfaWithStates_0(12, 50, 13);
            break;
         case 110:
            return jjMoveStringLiteralDfa13_0(active0, 0x40000000L);
  @@ -1022,7 +1028,7 @@
         case 115:
            return jjMoveStringLiteralDfa13_0(active0, 0x10000000000L);
         case 116:
  -         return jjMoveStringLiteralDfa13_0(active0, 0x100000000000000L);
  +         return jjMoveStringLiteralDfa13_0(active0, 0x200000000000000L);
         default :
            break;
      }
  @@ -1042,13 +1048,13 @@
         case 45:
            return jjMoveStringLiteralDfa14_0(active0, 0x80000000000L);
         case 99:
  -         return jjMoveStringLiteralDfa14_0(active0, 0x800000000000000L);
  +         return jjMoveStringLiteralDfa14_0(active0, 0x1000000000000000L);
         case 101:
  -         return jjMoveStringLiteralDfa14_0(active0, 0x100010000000000L);
  +         return jjMoveStringLiteralDfa14_0(active0, 0x200010000000000L);
         case 108:
            return jjMoveStringLiteralDfa14_0(active0, 0x60000000000L);
         case 111:
  -         return jjMoveStringLiteralDfa14_0(active0, 0x80000000000000L);
  +         return jjMoveStringLiteralDfa14_0(active0, 0x100000000000000L);
         case 115:
            return jjMoveStringLiteralDfa14_0(active0, 0x40000000L);
         default :
  @@ -1068,17 +1074,17 @@
      switch(curChar)
      {
         case 101:
  -         if ((active0 & 0x800000000000000L) != 0L)
  -            return jjStartNfaWithStates_0(14, 59, 13);
  +         if ((active0 & 0x1000000000000000L) != 0L)
  +            return jjStartNfaWithStates_0(14, 60, 13);
            break;
         case 105:
            return jjMoveStringLiteralDfa15_0(active0, 0x60000000000L);
         case 108:
            return jjMoveStringLiteralDfa15_0(active0, 0x10000000000L);
         case 114:
  -         if ((active0 & 0x100000000000000L) != 0L)
  -            return jjStartNfaWithStates_0(14, 56, 13);
  -         return jjMoveStringLiteralDfa15_0(active0, 0x80000000000000L);
  +         if ((active0 & 0x200000000000000L) != 0L)
  +            return jjStartNfaWithStates_0(14, 57, 13);
  +         return jjMoveStringLiteralDfa15_0(active0, 0x100000000000000L);
         case 115:
            return jjMoveStringLiteralDfa15_0(active0, 0x80000000000L);
         case 116:
  @@ -1100,8 +1106,8 @@
      switch(curChar)
      {
         case 101:
  -         if ((active0 & 0x80000000000000L) != 0L)
  -            return jjStartNfaWithStates_0(15, 55, 13);
  +         if ((active0 & 0x100000000000000L) != 0L)
  +            return jjStartNfaWithStates_0(15, 56, 13);
            return jjMoveStringLiteralDfa16_0(active0, 0x80000000000L);
         case 102:
            return jjMoveStringLiteralDfa16_0(active0, 0x10000000000L);
  @@ -1500,8 +1506,8 @@
                  case 13:
                     if ((0x3ff600000000000L & l) == 0L)
                        break;
  -                  if (kind > 72)
  -                     kind = 72;
  +                  if (kind > 73)
  +                     kind = 73;
                     jjstateSet[jjnewStateCnt++] = 13;
                     break;
                  default : break;
  @@ -1519,8 +1525,8 @@
                  case 13:
                     if ((0x7fffffe87fffffeL & l) == 0L)
                        break;
  -                  if (kind > 72)
  -                     kind = 72;
  +                  if (kind > 73)
  +                     kind = 73;
                     jjCheckNAdd(13);
                     break;
                  case 2:
  @@ -1547,8 +1553,8 @@
                  case 1:
                     if (!jjCanMove_1(hiByte, i1, i2, l1, l2))
                        break;
  -                  if (kind > 72)
  -                     kind = 72;
  +                  if (kind > 73)
  +                     kind = 73;
                     jjCheckNAdd(13);
                     break;
                  case 2:
  @@ -1562,8 +1568,8 @@
                  case 13:
                     if (!jjCanMove_2(hiByte, i1, i2, l1, l2))
                        break;
  -                  if (kind > 72)
  -                     kind = 72;
  +                  if (kind > 73)
  +                     kind = 73;
                     jjCheckNAdd(13);
                     break;
                  default : break;
  @@ -1724,7 +1730,7 @@
   "\144\145\163\143\145\156\144\141\156\164\72\72", "\141\156\143\145\163\164\157\162\55\157\162\55\163\145\154\146\72\72", 
   "\146\157\154\154\157\167\151\156\147\55\163\151\142\154\151\156\147\72\72", "\160\162\145\143\145\144\151\156\147\55\163\151\142\154\151\156\147\72\72", 
   "\144\145\163\143\145\156\144\141\156\164\55\157\162\55\163\145\154\146\72\72", "\154\141\163\164", "\160\157\163\151\164\151\157\156", 
  -"\143\157\165\156\164", "\151\144", "\154\157\143\141\154\55\156\141\155\145", 
  +"\143\157\165\156\164", "\151\144", "\153\145\171", "\154\157\143\141\154\55\156\141\155\145", 
   "\156\141\155\145\163\160\141\143\145\55\165\162\151", "\156\141\155\145", "\163\164\162\151\156\147", "\143\157\156\143\141\164", 
   "\163\164\141\162\164\163\55\167\151\164\150", "\143\157\156\164\141\151\156\163", 
   "\163\165\142\163\164\162\151\156\147\55\142\145\146\157\162\145", "\163\165\142\163\164\162\151\156\147\55\141\146\164\145\162", 
  @@ -1738,7 +1744,7 @@
      "DEFAULT", 
   };
   static final long[] jjtoToken = {
  -   0xffffffffff817ffdL, 0x7ffffL, 
  +   0xffffffffff817ffdL, 0xfffffL, 
   };
   static final long[] jjtoSkip = {
      0x2L, 0x0L, 
  
  
  
  1.3       +27 -25    jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/parser/XPathParserConstants.java
  
  Index: XPathParserConstants.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/parser/XPathParserConstants.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- XPathParserConstants.java	21 Sep 2001 23:22:44 -0000	1.2
  +++ XPathParserConstants.java	8 Jun 2002 22:47:24 -0000	1.3
  @@ -51,31 +51,32 @@
     int FUNCTION_POSITION = 45;
     int FUNCTION_COUNT = 46;
     int FUNCTION_ID = 47;
  -  int FUNCTION_LOCAL_NAME = 48;
  -  int FUNCTION_NAMESPACE_URI = 49;
  -  int FUNCTION_NAME = 50;
  -  int FUNCTION_STRING = 51;
  -  int FUNCTION_CONCAT = 52;
  -  int FUNCTION_STARTS_WITH = 53;
  -  int FUNCTION_CONTAINS = 54;
  -  int FUNCTION_SUBSTRING_BEFORE = 55;
  -  int FUNCTION_SUBSTRING_AFTER = 56;
  -  int FUNCTION_SUBSTRING = 57;
  -  int FUNCTION_STRING_LENGTH = 58;
  -  int FUNCTION_NORMALIZE_SPACE = 59;
  -  int FUNCTION_TRANSLATE = 60;
  -  int FUNCTION_BOOLEAN = 61;
  -  int FUNCTION_NOT = 62;
  -  int FUNCTION_TRUE = 63;
  -  int FUNCTION_FALSE = 64;
  -  int FUNCTION_NULL = 65;
  -  int FUNCTION_LANG = 66;
  -  int FUNCTION_NUMBER = 67;
  -  int FUNCTION_SUM = 68;
  -  int FUNCTION_FLOOR = 69;
  -  int FUNCTION_CEILING = 70;
  -  int FUNCTION_ROUND = 71;
  -  int NCName = 72;
  +  int FUNCTION_KEY = 48;
  +  int FUNCTION_LOCAL_NAME = 49;
  +  int FUNCTION_NAMESPACE_URI = 50;
  +  int FUNCTION_NAME = 51;
  +  int FUNCTION_STRING = 52;
  +  int FUNCTION_CONCAT = 53;
  +  int FUNCTION_STARTS_WITH = 54;
  +  int FUNCTION_CONTAINS = 55;
  +  int FUNCTION_SUBSTRING_BEFORE = 56;
  +  int FUNCTION_SUBSTRING_AFTER = 57;
  +  int FUNCTION_SUBSTRING = 58;
  +  int FUNCTION_STRING_LENGTH = 59;
  +  int FUNCTION_NORMALIZE_SPACE = 60;
  +  int FUNCTION_TRANSLATE = 61;
  +  int FUNCTION_BOOLEAN = 62;
  +  int FUNCTION_NOT = 63;
  +  int FUNCTION_TRUE = 64;
  +  int FUNCTION_FALSE = 65;
  +  int FUNCTION_NULL = 66;
  +  int FUNCTION_LANG = 67;
  +  int FUNCTION_NUMBER = 68;
  +  int FUNCTION_SUM = 69;
  +  int FUNCTION_FLOOR = 70;
  +  int FUNCTION_CEILING = 71;
  +  int FUNCTION_ROUND = 72;
  +  int NCName = 73;
   
     int DEFAULT = 0;
   
  @@ -128,6 +129,7 @@
       "\"position\"",
       "\"count\"",
       "\"id\"",
  +    "\"key\"",
       "\"local-name\"",
       "\"namespace-uri\"",
       "\"name\"",
  
  
  
  1.3       +906 -872  jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/parser/XPathParser.java
  
  Index: XPathParser.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/parser/XPathParser.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- XPathParser.java	21 Sep 2001 23:22:44 -0000	1.2
  +++ XPathParser.java	8 Jun 2002 22:47:24 -0000	1.3
  @@ -131,6 +131,9 @@
       case FUNCTION_ROUND:
         jj_consume_token(FUNCTION_ROUND);
         break;
  +    case FUNCTION_KEY:
  +      jj_consume_token(FUNCTION_KEY);
  +      break;
       default:
         jj_la1[0] = jj_gen;
         jj_consume_token(-1);
  @@ -281,6 +284,10 @@
         jj_consume_token(FUNCTION_ROUND);
                                         code = Compiler.FUNCTION_ROUND;
         break;
  +    case FUNCTION_KEY:
  +      jj_consume_token(FUNCTION_KEY);
  +                                      code = Compiler.FUNCTION_KEY;
  +      break;
       default:
         jj_la1[2] = jj_gen;
         jj_consume_token(-1);
  @@ -294,8 +301,8 @@
    String nc1, nc2 = null;
       nc1 = NCName();
       switch (jj_nt.kind) {
  -    case 73:
  -      jj_consume_token(73);
  +    case 74:
  +      jj_consume_token(74);
         nc2 = NCName();
         break;
       default:
  @@ -315,7 +322,7 @@
       String nc1, nc2 = null;
       if (jj_2_1(2147483647)) {
         nc1 = NCName();
  -      jj_consume_token(73);
  +      jj_consume_token(74);
         nc2 = NCName();
       } else {
         switch (jj_nt.kind) {
  @@ -448,6 +455,7 @@
       case FUNCTION_POSITION:
       case FUNCTION_COUNT:
       case FUNCTION_ID:
  +    case FUNCTION_KEY:
       case FUNCTION_LOCAL_NAME:
       case FUNCTION_NAMESPACE_URI:
       case FUNCTION_NAME:
  @@ -473,10 +481,10 @@
       case FUNCTION_CEILING:
       case FUNCTION_ROUND:
       case NCName:
  -    case 76:
       case 77:
  -    case 80:
  -    case 82:
  +    case 78:
  +    case 81:
  +    case 83:
         ex = RelativeLocationPath();
         break;
       case SLASH:
  @@ -612,6 +620,7 @@
       case FUNCTION_POSITION:
       case FUNCTION_COUNT:
       case FUNCTION_ID:
  +    case FUNCTION_KEY:
       case FUNCTION_LOCAL_NAME:
       case FUNCTION_NAMESPACE_URI:
       case FUNCTION_NAME:
  @@ -637,19 +646,19 @@
       case FUNCTION_CEILING:
       case FUNCTION_ROUND:
       case NCName:
  -    case 80:
  -    case 82:
  +    case 81:
  +    case 83:
         axis = AxisSpecifier();
         if (jj_2_3(2147483647)) {
           type = NodeType();
  -        jj_consume_token(74);
           jj_consume_token(75);
  +        jj_consume_token(76);
         } else if (jj_2_4(2147483647)) {
           jj_consume_token(PI);
  -        jj_consume_token(74);
  +        jj_consume_token(75);
           jj_consume_token(Literal);
                       instruction = unescape(token.image.substring(1, token.image.length() - 1));
  -        jj_consume_token(75);
  +        jj_consume_token(76);
         } else {
           switch (jj_nt.kind) {
           case OR:
  @@ -664,6 +673,7 @@
           case FUNCTION_POSITION:
           case FUNCTION_COUNT:
           case FUNCTION_ID:
  +        case FUNCTION_KEY:
           case FUNCTION_LOCAL_NAME:
           case FUNCTION_NAMESPACE_URI:
           case FUNCTION_NAME:
  @@ -689,7 +699,7 @@
           case FUNCTION_CEILING:
           case FUNCTION_ROUND:
           case NCName:
  -        case 82:
  +        case 83:
             name = WildcardName();
             break;
           default:
  @@ -699,13 +709,13 @@
           }
         }
         break;
  -    case 76:
  -      jj_consume_token(76);
  +    case 77:
  +      jj_consume_token(77);
                       axis = Compiler.AXIS_SELF;
                       type = Compiler.NODE_TYPE_NODE;
         break;
  -    case 77:
  -      jj_consume_token(77);
  +    case 78:
  +      jj_consume_token(78);
                       axis = Compiler.AXIS_PARENT;
                       type = Compiler.NODE_TYPE_NODE;
         break;
  @@ -717,7 +727,7 @@
       label_3:
       while (true) {
         switch (jj_nt.kind) {
  -      case 78:
  +      case 79:
           ;
           break;
         default:
  @@ -850,9 +860,9 @@
   /* [9] PredicateExpr ::=  Expr  */
     final public Object Predicate() throws ParseException {
       Object ex;
  -    jj_consume_token(78);
  -    ex = Expression();
       jj_consume_token(79);
  +    ex = Expression();
  +    jj_consume_token(80);
           {if (true) return ex;}
       throw new Error("Missing return statement in function");
     }
  @@ -863,8 +873,8 @@
     final public int AbbreviatedAxisSpecifier() throws ParseException {
       int axis = Compiler.AXIS_CHILD;
       switch (jj_nt.kind) {
  -    case 80:
  -      jj_consume_token(80);
  +    case 81:
  +      jj_consume_token(81);
              axis = Compiler.AXIS_ATTRIBUTE;
         break;
       default:
  @@ -908,10 +918,10 @@
       case VARIABLE:
         ex = VariableReference();
         break;
  -    case 74:
  -      jj_consume_token(74);
  -      ex = Expression();
  +    case 75:
         jj_consume_token(75);
  +      ex = Expression();
  +      jj_consume_token(76);
         break;
       case Literal:
         jj_consume_token(Literal);
  @@ -939,6 +949,7 @@
           case FUNCTION_POSITION:
           case FUNCTION_COUNT:
           case FUNCTION_ID:
  +        case FUNCTION_KEY:
           case FUNCTION_LOCAL_NAME:
           case FUNCTION_NAMESPACE_URI:
           case FUNCTION_NAME:
  @@ -1013,7 +1024,7 @@
     final public ArrayList ArgumentList() throws ParseException {
       ArrayList args = null;
       Object arg;
  -    jj_consume_token(74);
  +    jj_consume_token(75);
       switch (jj_nt.kind) {
       case SLASH:
       case SLASHSLASH:
  @@ -1046,6 +1057,7 @@
       case FUNCTION_POSITION:
       case FUNCTION_COUNT:
       case FUNCTION_ID:
  +    case FUNCTION_KEY:
       case FUNCTION_LOCAL_NAME:
       case FUNCTION_NAMESPACE_URI:
       case FUNCTION_NAME:
  @@ -1071,24 +1083,24 @@
       case FUNCTION_CEILING:
       case FUNCTION_ROUND:
       case NCName:
  -    case 74:
  -    case 76:
  +    case 75:
       case 77:
  -    case 80:
  -    case 82:
  +    case 78:
  +    case 81:
  +    case 83:
         arg = Argument();
                                   args = new ArrayList(); args.add(arg);
         label_4:
         while (true) {
           switch (jj_nt.kind) {
  -        case 81:
  +        case 82:
             ;
             break;
           default:
             jj_la1[18] = jj_gen;
             break label_4;
           }
  -        jj_consume_token(81);
  +        jj_consume_token(82);
           arg = Argument();
                                          args.add(arg);
         }
  @@ -1097,7 +1109,7 @@
         jj_la1[19] = jj_gen;
         ;
       }
  -    jj_consume_token(75);
  +    jj_consume_token(76);
           {if (true) return args;}
       throw new Error("Missing return statement in function");
     }
  @@ -1179,6 +1191,7 @@
         case FUNCTION_POSITION:
         case FUNCTION_COUNT:
         case FUNCTION_ID:
  +      case FUNCTION_KEY:
         case FUNCTION_LOCAL_NAME:
         case FUNCTION_NAMESPACE_URI:
         case FUNCTION_NAME:
  @@ -1204,10 +1217,10 @@
         case FUNCTION_CEILING:
         case FUNCTION_ROUND:
         case NCName:
  -      case 76:
         case 77:
  -      case 80:
  -      case 82:
  +      case 78:
  +      case 81:
  +      case 83:
           ex = LocationPath();
           break;
         default:
  @@ -1230,7 +1243,7 @@
       label_6:
       while (true) {
         switch (jj_nt.kind) {
  -      case 78:
  +      case 79:
           ;
           break;
         default:
  @@ -1478,7 +1491,7 @@
         switch (jj_nt.kind) {
         case MOD:
         case DIV:
  -      case 82:
  +      case 83:
           ;
           break;
         default:
  @@ -1486,8 +1499,8 @@
           break label_14;
         }
         switch (jj_nt.kind) {
  -      case 82:
  -        jj_consume_token(82);
  +      case 83:
  +        jj_consume_token(83);
           r = UnaryExpr();
                                       ex = compiler.multiply(ex, r);
           break;
  @@ -1545,6 +1558,7 @@
       case FUNCTION_POSITION:
       case FUNCTION_COUNT:
       case FUNCTION_ID:
  +    case FUNCTION_KEY:
       case FUNCTION_LOCAL_NAME:
       case FUNCTION_NAMESPACE_URI:
       case FUNCTION_NAME:
  @@ -1570,11 +1584,11 @@
       case FUNCTION_CEILING:
       case FUNCTION_ROUND:
       case NCName:
  -    case 74:
  -    case 76:
  +    case 75:
       case 77:
  -    case 80:
  -    case 82:
  +    case 78:
  +    case 81:
  +    case 83:
         ex = UnionExpr();
         break;
       case MINUS:
  @@ -1646,8 +1660,8 @@
       Object qn;
       String nc1, nc2 = null;
       switch (jj_nt.kind) {
  -    case 82:
  -      jj_consume_token(82);
  +    case 83:
  +      jj_consume_token(83);
         break;
       case OR:
       case AND:
  @@ -1661,6 +1675,7 @@
       case FUNCTION_POSITION:
       case FUNCTION_COUNT:
       case FUNCTION_ID:
  +    case FUNCTION_KEY:
       case FUNCTION_LOCAL_NAME:
       case FUNCTION_NAMESPACE_URI:
       case FUNCTION_NAME:
  @@ -1695,11 +1710,11 @@
       }
                              nc1 = token.image;
       switch (jj_nt.kind) {
  -    case 73:
  -      jj_consume_token(73);
  +    case 74:
  +      jj_consume_token(74);
         switch (jj_nt.kind) {
  -      case 82:
  -        jj_consume_token(82);
  +      case 83:
  +        jj_consume_token(83);
           break;
         case OR:
         case AND:
  @@ -1713,6 +1728,7 @@
         case FUNCTION_POSITION:
         case FUNCTION_COUNT:
         case FUNCTION_ID:
  +      case FUNCTION_KEY:
         case FUNCTION_LOCAL_NAME:
         case FUNCTION_NAMESPACE_URI:
         case FUNCTION_NAME:
  @@ -1832,712 +1848,565 @@
       return retval;
     }
   
  -  final private boolean jj_3R_87() {
  -    if (jj_scan_token(FUNCTION_ROUND)) return true;
  +  final private boolean jj_3R_65() {
  +    if (jj_scan_token(FUNCTION_LOCAL_NAME)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_59() {
  -    if (jj_scan_token(PI)) return true;
  +  final private boolean jj_3R_64() {
  +    if (jj_scan_token(FUNCTION_ID)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_58() {
  -    if (jj_scan_token(COMMENT)) return true;
  +  final private boolean jj_3R_63() {
  +    if (jj_scan_token(FUNCTION_COUNT)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_86() {
  -    if (jj_scan_token(FUNCTION_CEILING)) return true;
  +  final private boolean jj_3R_62() {
  +    if (jj_scan_token(FUNCTION_POSITION)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_57() {
  -    if (jj_scan_token(NODE)) return true;
  +  final private boolean jj_3R_102() {
  +    if (jj_3R_116()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_85() {
  -    if (jj_scan_token(FUNCTION_FLOOR)) return true;
  +  final private boolean jj_3R_61() {
  +    if (jj_scan_token(FUNCTION_LAST)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_84() {
  -    if (jj_scan_token(FUNCTION_SUM)) return true;
  +  final private boolean jj_3R_18() {
  +    Token xsp;
  +    xsp = jj_scanpos;
  +    if (jj_3R_61()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_62()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_63()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_64()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_65()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_66()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_67()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_68()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_69()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_70()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_71()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_72()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_73()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_74()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_75()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_76()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_77()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_78()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_79()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_80()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_81()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_82()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_83()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_84()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_85()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_86()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_87()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_88()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_89()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_56() {
  -    if (jj_scan_token(TEXT)) return true;
  +  final private boolean jj_3R_109() {
  +    if (jj_scan_token(DIV)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_83() {
  -    if (jj_scan_token(FUNCTION_NUMBER)) return true;
  +  final private boolean jj_3R_108() {
  +    if (jj_scan_token(MOD)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_82() {
  -    if (jj_scan_token(FUNCTION_LANG)) return true;
  +  final private boolean jj_3R_107() {
  +    if (jj_scan_token(AND)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_81() {
  -    if (jj_scan_token(FUNCTION_NULL)) return true;
  +  final private boolean jj_3R_106() {
  +    if (jj_scan_token(OR)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_80() {
  -    if (jj_scan_token(FUNCTION_FALSE)) return true;
  +  final private boolean jj_3R_105() {
  +    if (jj_scan_token(NCName)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_79() {
  -    if (jj_scan_token(FUNCTION_TRUE)) return true;
  +  final private boolean jj_3R_96() {
  +    Token xsp;
  +    xsp = jj_scanpos;
  +    if (jj_3R_105()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_106()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_107()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_108()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_109()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_78() {
  -    if (jj_scan_token(FUNCTION_NOT)) return true;
  +  final private boolean jj_3R_171() {
  +    if (jj_scan_token(MINUS)) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    if (jj_3R_168()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_17() {
  +  final private boolean jj_3R_169() {
       Token xsp;
       xsp = jj_scanpos;
  -    if (jj_3R_56()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_57()) {
  +    if (jj_3R_172()) {
       jj_scanpos = xsp;
  -    if (jj_3R_58()) {
  +    if (jj_3R_173()) {
       jj_scanpos = xsp;
  -    if (jj_3R_59()) return true;
  +    if (jj_3R_174()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_77() {
  -    if (jj_scan_token(FUNCTION_BOOLEAN)) return true;
  +  final private boolean jj_3R_170() {
  +    if (jj_3R_175()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_76() {
  -    if (jj_scan_token(FUNCTION_TRANSLATE)) return true;
  +  final private boolean jj_3R_151() {
  +    if (jj_scan_token(81)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_75() {
  -    if (jj_scan_token(FUNCTION_NORMALIZE_SPACE)) return true;
  +  final private boolean jj_3R_53() {
  +    if (jj_scan_token(FUNCTION_KEY)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_74() {
  -    if (jj_scan_token(FUNCTION_STRING_LENGTH)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +  final private boolean jj_3R_128() {
  +    Token xsp;
  +    xsp = jj_scanpos;
  +    if (jj_3R_151()) jj_scanpos = xsp;
  +    else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_102() {
  -    if (jj_3R_116()) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_3R_115()) return true;
  +  final private boolean jj_3R_52() {
  +    if (jj_scan_token(FUNCTION_ROUND)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_151() {
  -    if (jj_3R_15()) return true;
  +  final private boolean jj_3R_168() {
  +    Token xsp;
  +    xsp = jj_scanpos;
  +    if (jj_3R_170()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_171()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_73() {
  -    if (jj_scan_token(FUNCTION_SUBSTRING)) return true;
  +  final private boolean jj_3R_51() {
  +    if (jj_scan_token(FUNCTION_CEILING)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_72() {
  -    if (jj_scan_token(FUNCTION_SUBSTRING_AFTER)) return true;
  +  final private boolean jj_3R_50() {
  +    if (jj_scan_token(FUNCTION_FLOOR)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_71() {
  -    if (jj_scan_token(FUNCTION_SUBSTRING_BEFORE)) return true;
  +  final private boolean jj_3R_49() {
  +    if (jj_scan_token(FUNCTION_SUM)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_70() {
  -    if (jj_scan_token(FUNCTION_CONTAINS)) return true;
  +  final private boolean jj_3R_48() {
  +    if (jj_scan_token(FUNCTION_NUMBER)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3_5() {
  -    if (jj_3R_18()) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_scan_token(74)) return true;
  +  final private boolean jj_3R_47() {
  +    if (jj_scan_token(FUNCTION_LANG)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_69() {
  -    if (jj_scan_token(FUNCTION_STARTS_WITH)) return true;
  +  final private boolean jj_3R_46() {
  +    if (jj_scan_token(FUNCTION_NULL)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_68() {
  -    if (jj_scan_token(FUNCTION_CONCAT)) return true;
  +  final private boolean jj_3R_174() {
  +    if (jj_scan_token(MOD)) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    if (jj_3R_168()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_128() {
  -    if (jj_3R_15()) return true;
  +  final private boolean jj_3R_45() {
  +    if (jj_scan_token(FUNCTION_FALSE)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_150() {
  -    if (jj_scan_token(82)) return true;
  +  final private boolean jj_3R_173() {
  +    if (jj_scan_token(DIV)) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    if (jj_3R_168()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_67() {
  -    if (jj_scan_token(FUNCTION_STRING)) return true;
  +  final private boolean jj_3R_44() {
  +    if (jj_scan_token(FUNCTION_TRUE)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_66() {
  -    if (jj_scan_token(FUNCTION_NAME)) return true;
  +  final private boolean jj_3R_172() {
  +    if (jj_scan_token(83)) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    if (jj_3R_168()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_65() {
  -    if (jj_scan_token(FUNCTION_NAMESPACE_URI)) return true;
  +  final private boolean jj_3R_43() {
  +    if (jj_scan_token(FUNCTION_NOT)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_64() {
  -    if (jj_scan_token(FUNCTION_LOCAL_NAME)) return true;
  +  final private boolean jj_3R_42() {
  +    if (jj_scan_token(FUNCTION_BOOLEAN)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_63() {
  -    if (jj_scan_token(FUNCTION_ID)) return true;
  +  final private boolean jj_3R_41() {
  +    if (jj_scan_token(FUNCTION_TRANSLATE)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_129() {
  -    if (jj_scan_token(73)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    Token xsp;
  -    xsp = jj_scanpos;
  -    if (jj_3R_150()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_151()) return true;
  +  final private boolean jj_3R_40() {
  +    if (jj_scan_token(FUNCTION_NORMALIZE_SPACE)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_62() {
  -    if (jj_scan_token(FUNCTION_COUNT)) return true;
  +  final private boolean jj_3R_39() {
  +    if (jj_scan_token(FUNCTION_STRING_LENGTH)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_127() {
  -    if (jj_scan_token(82)) return true;
  +  final private boolean jj_3R_114() {
  +    if (jj_scan_token(79)) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    if (jj_3R_102()) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    if (jj_scan_token(80)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_61() {
  -    if (jj_scan_token(FUNCTION_POSITION)) return true;
  +  final private boolean jj_3R_38() {
  +    if (jj_scan_token(FUNCTION_SUBSTRING)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_93() {
  -    if (jj_3R_102()) return true;
  +  final private boolean jj_3R_37() {
  +    if (jj_scan_token(FUNCTION_SUBSTRING_AFTER)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_60() {
  -    if (jj_scan_token(FUNCTION_LAST)) return true;
  +  final private boolean jj_3R_36() {
  +    if (jj_scan_token(FUNCTION_SUBSTRING_BEFORE)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_92() {
  -    if (jj_3R_101()) return true;
  +  final private boolean jj_3R_35() {
  +    if (jj_scan_token(FUNCTION_CONTAINS)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_91() {
  -    if (jj_scan_token(Number)) return true;
  +  final private boolean jj_3R_34() {
  +    if (jj_scan_token(FUNCTION_STARTS_WITH)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_90() {
  -    if (jj_scan_token(Literal)) return true;
  +  final private boolean jj_3R_166() {
  +    if (jj_3R_168()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    Token xsp;
  +    while (true) {
  +      xsp = jj_scanpos;
  +      if (jj_3R_169()) { jj_scanpos = xsp; break; }
  +      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    }
       return false;
     }
   
  -  final private boolean jj_3R_89() {
  -    if (jj_scan_token(74)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_3R_100()) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_scan_token(75)) return true;
  +  final private boolean jj_3R_33() {
  +    if (jj_scan_token(FUNCTION_CONCAT)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_88() {
  -    if (jj_3R_99()) return true;
  +  final private boolean jj_3R_32() {
  +    if (jj_scan_token(FUNCTION_STRING)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_119() {
  -    Token xsp;
  -    xsp = jj_scanpos;
  -    if (jj_3R_127()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_128()) return true;
  +  final private boolean jj_3R_31() {
  +    if (jj_scan_token(FUNCTION_NAME)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    xsp = jj_scanpos;
  -    if (jj_3R_129()) jj_scanpos = xsp;
  -    else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_18() {
  -    Token xsp;
  -    xsp = jj_scanpos;
  -    if (jj_3R_60()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_61()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_62()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_63()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_64()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_65()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_66()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_67()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_68()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_69()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_70()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_71()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_72()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_73()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_74()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_75()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_76()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_77()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_78()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_79()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_80()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_81()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_82()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_83()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_84()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_85()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_86()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_87()) return true;
  +  final private boolean jj_3R_30() {
  +    if (jj_scan_token(FUNCTION_NAMESPACE_URI)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_19() {
  -    Token xsp;
  -    xsp = jj_scanpos;
  -    if (jj_3R_88()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_89()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_90()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_91()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_92()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_93()) return true;
  +  final private boolean jj_3R_29() {
  +    if (jj_scan_token(FUNCTION_LOCAL_NAME)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_107() {
  -    if (jj_scan_token(DIV)) return true;
  +  final private boolean jj_3R_28() {
  +    if (jj_scan_token(FUNCTION_ID)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_106() {
  -    if (jj_scan_token(MOD)) return true;
  +  final private boolean jj_3R_27() {
  +    if (jj_scan_token(FUNCTION_COUNT)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_105() {
  -    if (jj_scan_token(AND)) return true;
  +  final private boolean jj_3R_167() {
  +    if (jj_scan_token(MINUS)) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    if (jj_3R_166()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_104() {
  -    if (jj_scan_token(OR)) return true;
  +  final private boolean jj_3R_26() {
  +    if (jj_scan_token(FUNCTION_POSITION)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_103() {
  -    if (jj_scan_token(NCName)) return true;
  +  final private boolean jj_3R_25() {
  +    if (jj_scan_token(FUNCTION_LAST)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_99() {
  -    if (jj_scan_token(VARIABLE)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_3R_113()) return true;
  +  final private boolean jj_3R_24() {
  +    if (jj_scan_token(PI)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_94() {
  -    Token xsp;
  -    xsp = jj_scanpos;
  -    if (jj_3R_103()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_104()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_105()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_106()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_107()) return true;
  +  final private boolean jj_3R_150() {
  +    if (jj_scan_token(AXIS_DESCENDANT_OR_SELF)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_100() {
  -    if (jj_3R_114()) return true;
  +  final private boolean jj_3R_23() {
  +    if (jj_scan_token(COMMENT)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_52() {
  -    if (jj_scan_token(FUNCTION_ROUND)) return true;
  +  final private boolean jj_3R_149() {
  +    if (jj_scan_token(AXIS_PRECEDING_SIBLING)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_51() {
  -    if (jj_scan_token(FUNCTION_CEILING)) return true;
  +  final private boolean jj_3R_22() {
  +    if (jj_scan_token(TEXT)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_116() {
  -    if (jj_3R_124()) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    return false;
  -  }
  -
  -  final private boolean jj_3R_50() {
  -    if (jj_scan_token(FUNCTION_FLOOR)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    return false;
  -  }
  -
  -  final private boolean jj_3R_49() {
  -    if (jj_scan_token(FUNCTION_SUM)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    return false;
  -  }
  -
  -  final private boolean jj_3R_48() {
  -    if (jj_scan_token(FUNCTION_NUMBER)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    return false;
  -  }
  -
  -  final private boolean jj_3R_47() {
  -    if (jj_scan_token(FUNCTION_LANG)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    return false;
  -  }
  -
  -  final private boolean jj_3R_46() {
  -    if (jj_scan_token(FUNCTION_NULL)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    return false;
  -  }
  -
  -  final private boolean jj_3R_45() {
  -    if (jj_scan_token(FUNCTION_FALSE)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    return false;
  -  }
  -
  -  final private boolean jj_3R_44() {
  -    if (jj_scan_token(FUNCTION_TRUE)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    return false;
  -  }
  -
  -  final private boolean jj_3R_43() {
  -    if (jj_scan_token(FUNCTION_NOT)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    return false;
  -  }
  -
  -  final private boolean jj_3R_42() {
  -    if (jj_scan_token(FUNCTION_BOOLEAN)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    return false;
  -  }
  -
  -  final private boolean jj_3R_41() {
  -    if (jj_scan_token(FUNCTION_TRANSLATE)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    return false;
  -  }
  -
  -  final private boolean jj_3R_40() {
  -    if (jj_scan_token(FUNCTION_NORMALIZE_SPACE)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    return false;
  -  }
  -
  -  final private boolean jj_3R_39() {
  -    if (jj_scan_token(FUNCTION_STRING_LENGTH)) return true;
  +  final private boolean jj_3R_148() {
  +    if (jj_scan_token(AXIS_FOLLOWING_SIBLING)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_38() {
  -    if (jj_scan_token(FUNCTION_SUBSTRING)) return true;
  +  final private boolean jj_3R_21() {
  +    if (jj_scan_token(NODE)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_37() {
  -    if (jj_scan_token(FUNCTION_SUBSTRING_AFTER)) return true;
  +  final private boolean jj_3R_147() {
  +    if (jj_scan_token(AXIS_ANCESTOR_OR_SELF)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_36() {
  -    if (jj_scan_token(FUNCTION_SUBSTRING_BEFORE)) return true;
  +  final private boolean jj_3R_161() {
  +    if (jj_scan_token(PLUS)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    return false;
  -  }
  -
  -  final private boolean jj_3R_35() {
  -    if (jj_scan_token(FUNCTION_CONTAINS)) return true;
  +    if (jj_3R_160()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_34() {
  -    if (jj_scan_token(FUNCTION_STARTS_WITH)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    return false;
  -  }
  -
  -  final private boolean jj_3R_33() {
  -    if (jj_scan_token(FUNCTION_CONCAT)) return true;
  +  final private boolean jj_3R_20() {
  +    if (jj_3R_96()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_32() {
  -    if (jj_scan_token(FUNCTION_STRING)) return true;
  +  final private boolean jj_3R_146() {
  +    if (jj_scan_token(AXIS_DESCENDANT)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_31() {
  -    if (jj_scan_token(FUNCTION_NAME)) return true;
  +  final private boolean jj_3R_145() {
  +    if (jj_scan_token(AXIS_FOLLOWING)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_149() {
  -    if (jj_scan_token(80)) return true;
  +  final private boolean jj_3R_144() {
  +    if (jj_scan_token(AXIS_PRECEDING)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_30() {
  -    if (jj_scan_token(FUNCTION_NAMESPACE_URI)) return true;
  +  final private boolean jj_3R_143() {
  +    if (jj_scan_token(AXIS_NAMESPACE)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_29() {
  -    if (jj_scan_token(FUNCTION_LOCAL_NAME)) return true;
  +  final private boolean jj_3R_160() {
  +    if (jj_3R_166()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    return false;
  -  }
  -
  -  final private boolean jj_3R_126() {
       Token xsp;
  -    xsp = jj_scanpos;
  -    if (jj_3R_149()) jj_scanpos = xsp;
  -    else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    return false;
  -  }
  -
  -  final private boolean jj_3R_28() {
  -    if (jj_scan_token(FUNCTION_ID)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    return false;
  -  }
  -
  -  final private boolean jj_3R_27() {
  -    if (jj_scan_token(FUNCTION_COUNT)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    return false;
  -  }
  -
  -  final private boolean jj_3R_26() {
  -    if (jj_scan_token(FUNCTION_POSITION)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    return false;
  -  }
  -
  -  final private boolean jj_3R_25() {
  -    if (jj_scan_token(FUNCTION_LAST)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    return false;
  -  }
  -
  -  final private boolean jj_3R_24() {
  -    if (jj_scan_token(PI)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    return false;
  -  }
  -
  -  final private boolean jj_3R_23() {
  -    if (jj_scan_token(COMMENT)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    return false;
  -  }
  -
  -  final private boolean jj_3R_22() {
  -    if (jj_scan_token(TEXT)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    return false;
  -  }
  -
  -  final private boolean jj_3R_21() {
  -    if (jj_scan_token(NODE)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    while (true) {
  +      xsp = jj_scanpos;
  +      if (jj_3R_167()) { jj_scanpos = xsp; break; }
  +      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    }
       return false;
     }
   
  -  final private boolean jj_3R_20() {
  -    if (jj_3R_94()) return true;
  +  final private boolean jj_3R_142() {
  +    if (jj_scan_token(AXIS_ATTRIBUTE)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
  @@ -2609,7 +2478,9 @@
       jj_scanpos = xsp;
       if (jj_3R_51()) {
       jj_scanpos = xsp;
  -    if (jj_3R_52()) return true;
  +    if (jj_3R_52()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_53()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  @@ -2643,796 +2514,959 @@
       } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_112() {
  -    if (jj_scan_token(78)) return true;
  +  final private boolean jj_3R_141() {
  +    if (jj_scan_token(AXIS_ANCESTOR)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_3R_100()) return true;
  +    return false;
  +  }
  +
  +  final private boolean jj_3R_140() {
  +    if (jj_scan_token(AXIS_PARENT)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_scan_token(79)) return true;
  +    return false;
  +  }
  +
  +  final private boolean jj_3R_139() {
  +    if (jj_scan_token(AXIS_CHILD)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_169() {
  -    if (jj_scan_token(MINUS)) return true;
  +  final private boolean jj_3R_138() {
  +    if (jj_scan_token(AXIS_SELF)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_3R_166()) return true;
  +    return false;
  +  }
  +
  +  final private boolean jj_3R_127() {
  +    Token xsp;
  +    xsp = jj_scanpos;
  +    if (jj_3R_138()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_139()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_140()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_141()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_142()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_143()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_144()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_145()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_146()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_147()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_148()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_149()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_150()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_167() {
  +  final private boolean jj_3R_157() {
       Token xsp;
       xsp = jj_scanpos;
  -    if (jj_3R_170()) {
  +    if (jj_3R_162()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_163()) {
       jj_scanpos = xsp;
  -    if (jj_3R_171()) {
  +    if (jj_3R_164()) {
       jj_scanpos = xsp;
  -    if (jj_3R_172()) return true;
  +    if (jj_3R_165()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_168() {
  -    if (jj_3R_173()) return true;
  +  final private boolean jj_3R_156() {
  +    if (jj_3R_160()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    Token xsp;
  +    while (true) {
  +      xsp = jj_scanpos;
  +      if (jj_3R_161()) { jj_scanpos = xsp; break; }
  +      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    }
       return false;
     }
   
  -  final private boolean jj_3R_166() {
  +  final private boolean jj_3R_120() {
  +    if (jj_3R_128()) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    return false;
  +  }
  +
  +  final private boolean jj_3R_119() {
  +    if (jj_3R_127()) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    return false;
  +  }
  +
  +  final private boolean jj_3R_165() {
  +    if (jj_scan_token(GTE)) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    if (jj_3R_156()) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    return false;
  +  }
  +
  +  final private boolean jj_3R_110() {
       Token xsp;
       xsp = jj_scanpos;
  -    if (jj_3R_168()) {
  +    if (jj_3R_119()) {
       jj_scanpos = xsp;
  -    if (jj_3R_169()) return true;
  +    if (jj_3R_120()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_148() {
  -    if (jj_scan_token(AXIS_DESCENDANT_OR_SELF)) return true;
  +  final private boolean jj_3R_164() {
  +    if (jj_scan_token(LTE)) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    if (jj_3R_156()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_147() {
  -    if (jj_scan_token(AXIS_PRECEDING_SIBLING)) return true;
  +  final private boolean jj_3R_163() {
  +    if (jj_scan_token(GT)) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    if (jj_3R_156()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_146() {
  -    if (jj_scan_token(AXIS_FOLLOWING_SIBLING)) return true;
  +  final private boolean jj_3R_155() {
  +    Token xsp;
  +    xsp = jj_scanpos;
  +    if (jj_3R_158()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_159()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_172() {
  -    if (jj_scan_token(MOD)) return true;
  +  final private boolean jj_3R_162() {
  +    if (jj_scan_token(LT)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_3R_166()) return true;
  +    if (jj_3R_156()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_145() {
  -    if (jj_scan_token(AXIS_ANCESTOR_OR_SELF)) return true;
  +  final private boolean jj_3R_154() {
  +    if (jj_3R_156()) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    Token xsp;
  +    while (true) {
  +      xsp = jj_scanpos;
  +      if (jj_3R_157()) { jj_scanpos = xsp; break; }
  +      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    }
  +    return false;
  +  }
  +
  +  final private boolean jj_3R_159() {
  +    if (jj_scan_token(NEQ)) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    if (jj_3R_154()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_171() {
  -    if (jj_scan_token(DIV)) return true;
  +  final private boolean jj_3R_158() {
  +    if (jj_scan_token(EQ)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_3R_166()) return true;
  +    if (jj_3R_154()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_144() {
  -    if (jj_scan_token(AXIS_DESCENDANT)) return true;
  +  final private boolean jj_3R_100() {
  +    if (jj_3R_114()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_170() {
  -    if (jj_scan_token(82)) return true;
  +  final private boolean jj_3_4() {
  +    if (jj_scan_token(PI)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_3R_166()) return true;
  +    return false;
  +  }
  +
  +  final private boolean jj_3_3() {
  +    if (jj_3R_17()) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    if (jj_scan_token(75)) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    if (jj_scan_token(76)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_143() {
  -    if (jj_scan_token(AXIS_FOLLOWING)) return true;
  +  final private boolean jj_3R_99() {
  +    if (jj_scan_token(78)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_142() {
  -    if (jj_scan_token(AXIS_PRECEDING)) return true;
  +  final private boolean jj_3R_98() {
  +    if (jj_scan_token(77)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_141() {
  -    if (jj_scan_token(AXIS_NAMESPACE)) return true;
  +  final private boolean jj_3R_113() {
  +    if (jj_3R_121()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_140() {
  -    if (jj_scan_token(AXIS_ATTRIBUTE)) return true;
  +  final private boolean jj_3R_132() {
  +    if (jj_3R_154()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    Token xsp;
  +    while (true) {
  +      xsp = jj_scanpos;
  +      if (jj_3R_155()) { jj_scanpos = xsp; break; }
  +      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    }
       return false;
     }
   
  -  final private boolean jj_3R_139() {
  -    if (jj_scan_token(AXIS_ANCESTOR)) return true;
  +  final private boolean jj_3R_112() {
  +    if (jj_scan_token(PI)) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    if (jj_scan_token(75)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    if (jj_scan_token(Literal)) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    if (jj_scan_token(76)) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    return false;
  +  }
  +
  +  final private boolean jj_3R_111() {
  +    if (jj_3R_17()) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    if (jj_scan_token(75)) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    if (jj_scan_token(76)) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    return false;
  +  }
  +
  +  final private boolean jj_3R_97() {
  +    if (jj_3R_110()) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    Token xsp;
  +    xsp = jj_scanpos;
  +    if (jj_3R_111()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_112()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_113()) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    return false;
  +  }
  +
  +  final private boolean jj_3R_133() {
  +    if (jj_scan_token(AND)) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    if (jj_3R_132()) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    return false;
  +  }
  +
  +  final private boolean jj_3R_56() {
  +    Token xsp;
  +    xsp = jj_scanpos;
  +    if (jj_3R_97()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_98()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_99()) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    while (true) {
  +      xsp = jj_scanpos;
  +      if (jj_3R_100()) { jj_scanpos = xsp; break; }
  +      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    }
  +    return false;
  +  }
  +
  +  final private boolean jj_3R_123() {
  +    if (jj_3R_132()) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    Token xsp;
  +    while (true) {
  +      xsp = jj_scanpos;
  +      if (jj_3R_133()) { jj_scanpos = xsp; break; }
  +      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    }
  +    return false;
  +  }
  +
  +  final private boolean jj_3R_191() {
  +    if (jj_3R_16()) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    return false;
  +  }
  +
  +  final private boolean jj_3R_55() {
  +    if (jj_scan_token(SLASHSLASH)) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    return false;
  +  }
  +
  +  final private boolean jj_3R_54() {
  +    if (jj_scan_token(SLASH)) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    return false;
  +  }
  +
  +  final private boolean jj_3R_124() {
  +    if (jj_scan_token(OR)) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    if (jj_3R_123()) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    return false;
  +  }
  +
  +  final private boolean jj_3R_16() {
  +    Token xsp;
  +    xsp = jj_scanpos;
  +    if (jj_3R_54()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_55()) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    if (jj_3R_56()) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    return false;
  +  }
  +
  +  final private boolean jj_3R_188() {
  +    if (jj_3R_16()) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    return false;
  +  }
  +
  +  final private boolean jj_3R_116() {
  +    if (jj_3R_123()) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    Token xsp;
  +    while (true) {
  +      xsp = jj_scanpos;
  +      if (jj_3R_124()) { jj_scanpos = xsp; break; }
  +      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    }
  +    return false;
  +  }
  +
  +  final private boolean jj_3R_186() {
  +    if (jj_3R_56()) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    Token xsp;
  +    while (true) {
  +      xsp = jj_scanpos;
  +      if (jj_3R_188()) { jj_scanpos = xsp; break; }
  +      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    }
       return false;
     }
   
  -  final private boolean jj_3R_138() {
  -    if (jj_scan_token(AXIS_PARENT)) return true;
  +  final private boolean jj_3_2() {
  +    if (jj_3R_16()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_137() {
  -    if (jj_scan_token(AXIS_CHILD)) return true;
  +  final private boolean jj_3R_183() {
  +    if (jj_3R_16()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_136() {
  -    if (jj_scan_token(AXIS_SELF)) return true;
  +  final private boolean jj_3R_190() {
  +    if (jj_scan_token(SLASH)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_164() {
  -    if (jj_3R_166()) return true;
  +  final private boolean jj_3R_189() {
  +    if (jj_3R_16()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       Token xsp;
       while (true) {
         xsp = jj_scanpos;
  -      if (jj_3R_167()) { jj_scanpos = xsp; break; }
  +      if (jj_3R_191()) { jj_scanpos = xsp; break; }
         if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       }
       return false;
     }
   
  -  final private boolean jj_3R_125() {
  -    Token xsp;
  -    xsp = jj_scanpos;
  -    if (jj_3R_136()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_137()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_138()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_139()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_140()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_141()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_142()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_143()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_144()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_145()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_146()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_147()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_148()) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    return false;
  -  }
  -
  -  final private boolean jj_3R_165() {
  -    if (jj_scan_token(MINUS)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_3R_164()) return true;
  +  final private boolean jj_3R_182() {
  +    if (jj_3R_114()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_159() {
  -    if (jj_scan_token(PLUS)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_3R_158()) return true;
  +  final private boolean jj_3R_187() {
  +    Token xsp;
  +    xsp = jj_scanpos;
  +    if (jj_3R_189()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_190()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_158() {
  -    if (jj_3R_164()) return true;
  +  final private boolean jj_3R_180() {
  +    if (jj_3R_19()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       Token xsp;
       while (true) {
         xsp = jj_scanpos;
  -      if (jj_3R_165()) { jj_scanpos = xsp; break; }
  +      if (jj_3R_182()) { jj_scanpos = xsp; break; }
  +      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    }
  +    while (true) {
  +      xsp = jj_scanpos;
  +      if (jj_3R_183()) { jj_scanpos = xsp; break; }
         if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       }
       return false;
     }
   
  -  final private boolean jj_3R_118() {
  -    if (jj_3R_126()) return true;
  +  final private boolean jj_3_6() {
  +    if (jj_3R_19()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_117() {
  -    if (jj_3R_125()) return true;
  +  final private boolean jj_3R_185() {
  +    if (jj_3R_187()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_108() {
  -    Token xsp;
  -    xsp = jj_scanpos;
  -    if (jj_3R_117()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_118()) return true;
  +  final private boolean jj_3R_184() {
  +    if (jj_3R_186()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_155() {
  +  final private boolean jj_3R_181() {
       Token xsp;
       xsp = jj_scanpos;
  -    if (jj_3R_160()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_161()) {
  +    if (jj_3R_184()) {
       jj_scanpos = xsp;
  -    if (jj_3R_162()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_163()) return true;
  +    if (jj_3R_185()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_154() {
  -    if (jj_3R_158()) return true;
  +  final private boolean jj_3R_179() {
  +    if (jj_3R_181()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    Token xsp;
  -    while (true) {
  -      xsp = jj_scanpos;
  -      if (jj_3R_159()) { jj_scanpos = xsp; break; }
  -      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    }
       return false;
     }
   
  -  final private boolean jj_3R_98() {
  -    if (jj_3R_112()) return true;
  +  final private boolean jj_3R_178() {
  +    if (jj_3R_180()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3_4() {
  -    if (jj_scan_token(PI)) return true;
  +  final private boolean jj_3R_176() {
  +    Token xsp;
  +    xsp = jj_scanpos;
  +    if (jj_3R_178()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_179()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3_3() {
  -    if (jj_3R_17()) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_scan_token(74)) return true;
  +  final private boolean jj_3R_177() {
  +    if (jj_scan_token(UNION)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_scan_token(75)) return true;
  +    if (jj_3R_176()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_163() {
  -    if (jj_scan_token(GTE)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_3R_154()) return true;
  +  final private boolean jj_3R_175() {
  +    if (jj_3R_176()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    Token xsp;
  +    while (true) {
  +      xsp = jj_scanpos;
  +      if (jj_3R_177()) { jj_scanpos = xsp; break; }
  +      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    }
       return false;
     }
   
  -  final private boolean jj_3R_97() {
  -    if (jj_scan_token(77)) return true;
  +  final private boolean jj_3R_134() {
  +    if (jj_3R_102()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_162() {
  -    if (jj_scan_token(LTE)) return true;
  +  final private boolean jj_3R_135() {
  +    if (jj_scan_token(82)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_3R_154()) return true;
  +    if (jj_3R_134()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_161() {
  -    if (jj_scan_token(GT)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_3R_154()) return true;
  +  final private boolean jj_3R_125() {
  +    if (jj_3R_134()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    Token xsp;
  +    while (true) {
  +      xsp = jj_scanpos;
  +      if (jj_3R_135()) { jj_scanpos = xsp; break; }
  +      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    }
       return false;
     }
   
  -  final private boolean jj_3R_153() {
  +  final private boolean jj_3R_117() {
  +    if (jj_scan_token(75)) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       Token xsp;
       xsp = jj_scanpos;
  -    if (jj_3R_156()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_157()) return true;
  +    if (jj_3R_125()) jj_scanpos = xsp;
  +    else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    if (jj_scan_token(76)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_96() {
  -    if (jj_scan_token(76)) return true;
  +  final private boolean jj_3R_60() {
  +    if (jj_scan_token(PI)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_160() {
  -    if (jj_scan_token(LT)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_3R_154()) return true;
  +  final private boolean jj_3R_59() {
  +    if (jj_scan_token(COMMENT)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_111() {
  -    if (jj_3R_119()) return true;
  +  final private boolean jj_3R_58() {
  +    if (jj_scan_token(NODE)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_110() {
  -    if (jj_scan_token(PI)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_scan_token(74)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_scan_token(Literal)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_scan_token(75)) return true;
  +  final private boolean jj_3R_57() {
  +    if (jj_scan_token(TEXT)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_109() {
  -    if (jj_3R_17()) return true;
  +  final private boolean jj_3_1() {
  +    if (jj_3R_15()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       if (jj_scan_token(74)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_scan_token(75)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    return false;
  -  }
  -
  -  final private boolean jj_3R_152() {
  -    if (jj_3R_154()) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    Token xsp;
  -    while (true) {
  -      xsp = jj_scanpos;
  -      if (jj_3R_155()) { jj_scanpos = xsp; break; }
  -      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    }
       return false;
     }
   
  -  final private boolean jj_3R_95() {
  -    if (jj_3R_108()) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +  final private boolean jj_3R_17() {
       Token xsp;
       xsp = jj_scanpos;
  -    if (jj_3R_109()) {
  +    if (jj_3R_57()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_58()) {
       jj_scanpos = xsp;
  -    if (jj_3R_110()) {
  +    if (jj_3R_59()) {
       jj_scanpos = xsp;
  -    if (jj_3R_111()) return true;
  +    if (jj_3R_60()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_157() {
  -    if (jj_scan_token(NEQ)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_3R_152()) return true;
  +  final private boolean jj_3R_153() {
  +    if (jj_3R_15()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_156() {
  -    if (jj_scan_token(EQ)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_3R_152()) return true;
  +  final private boolean jj_3R_137() {
  +    if (jj_3R_96()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_55() {
  -    Token xsp;
  -    xsp = jj_scanpos;
  -    if (jj_3R_95()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_96()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_97()) return true;
  +  final private boolean jj_3R_136() {
  +    if (jj_3R_15()) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    if (jj_scan_token(74)) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    if (jj_3R_15()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    while (true) {
  -      xsp = jj_scanpos;
  -      if (jj_3R_98()) { jj_scanpos = xsp; break; }
  -      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    }
       return false;
     }
   
  -  final private boolean jj_3R_130() {
  -    if (jj_3R_152()) return true;
  +  final private boolean jj_3R_152() {
  +    if (jj_scan_token(83)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    Token xsp;
  -    while (true) {
  -      xsp = jj_scanpos;
  -      if (jj_3R_153()) { jj_scanpos = xsp; break; }
  -      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    }
       return false;
     }
   
  -  final private boolean jj_3R_189() {
  -    if (jj_3R_16()) return true;
  +  final private boolean jj_3R_130() {
  +    if (jj_3R_15()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_54() {
  -    if (jj_scan_token(SLASHSLASH)) return true;
  +  final private boolean jj_3R_103() {
  +    if (jj_3R_18()) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    if (jj_3R_117()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_131() {
  -    if (jj_scan_token(AND)) return true;
  +  final private boolean jj_3R_122() {
  +    if (jj_scan_token(74)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_3R_130()) return true;
  +    if (jj_3R_15()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_53() {
  -    if (jj_scan_token(SLASH)) return true;
  +  final private boolean jj_3R_131() {
  +    if (jj_scan_token(74)) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    Token xsp;
  +    xsp = jj_scanpos;
  +    if (jj_3R_152()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_153()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_16() {
  +  final private boolean jj_3R_126() {
       Token xsp;
       xsp = jj_scanpos;
  -    if (jj_3R_53()) {
  +    if (jj_3R_136()) {
       jj_scanpos = xsp;
  -    if (jj_3R_54()) return true;
  +    if (jj_3R_137()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_3R_55()) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_186() {
  -    if (jj_3R_16()) return true;
  +  final private boolean jj_3R_129() {
  +    if (jj_scan_token(83)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
     final private boolean jj_3R_121() {
  +    Token xsp;
  +    xsp = jj_scanpos;
  +    if (jj_3R_129()) {
  +    jj_scanpos = xsp;
       if (jj_3R_130()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    Token xsp;
  -    while (true) {
  -      xsp = jj_scanpos;
  -      if (jj_3R_131()) { jj_scanpos = xsp; break; }
  -      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    }
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    xsp = jj_scanpos;
  +    if (jj_3R_131()) jj_scanpos = xsp;
  +    else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_122() {
  -    if (jj_scan_token(OR)) return true;
  +  final private boolean jj_3R_104() {
  +    if (jj_3R_118()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_3R_121()) return true;
  +    if (jj_3R_117()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_184() {
  -    if (jj_3R_55()) return true;
  +  final private boolean jj_3R_115() {
  +    if (jj_3R_15()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       Token xsp;
  -    while (true) {
  -      xsp = jj_scanpos;
  -      if (jj_3R_186()) { jj_scanpos = xsp; break; }
  -      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    }
  +    xsp = jj_scanpos;
  +    if (jj_3R_122()) jj_scanpos = xsp;
  +    else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3_2() {
  -    if (jj_3R_16()) return true;
  +  final private boolean jj_3_5() {
  +    if (jj_3R_18()) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    if (jj_scan_token(75)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_114() {
  -    if (jj_3R_121()) return true;
  +  final private boolean jj_3R_101() {
  +    if (jj_scan_token(VARIABLE)) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    if (jj_3R_115()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    Token xsp;
  -    while (true) {
  -      xsp = jj_scanpos;
  -      if (jj_3R_122()) { jj_scanpos = xsp; break; }
  -      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    }
       return false;
     }
   
  -  final private boolean jj_3R_188() {
  -    if (jj_scan_token(SLASH)) return true;
  +  final private boolean jj_3R_89() {
  +    if (jj_scan_token(FUNCTION_KEY)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_187() {
  -    if (jj_3R_16()) return true;
  +  final private boolean jj_3R_88() {
  +    if (jj_scan_token(FUNCTION_ROUND)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    Token xsp;
  -    while (true) {
  -      xsp = jj_scanpos;
  -      if (jj_3R_189()) { jj_scanpos = xsp; break; }
  -      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    }
       return false;
     }
   
  -  final private boolean jj_3R_185() {
  -    Token xsp;
  -    xsp = jj_scanpos;
  -    if (jj_3R_187()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_188()) return true;
  +  final private boolean jj_3R_87() {
  +    if (jj_scan_token(FUNCTION_CEILING)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_183() {
  -    if (jj_3R_185()) return true;
  +  final private boolean jj_3R_86() {
  +    if (jj_scan_token(FUNCTION_FLOOR)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_182() {
  -    if (jj_3R_184()) return true;
  +  final private boolean jj_3R_95() {
  +    if (jj_3R_104()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_181() {
  -    if (jj_3R_16()) return true;
  +  final private boolean jj_3R_85() {
  +    if (jj_scan_token(FUNCTION_SUM)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_179() {
  -    Token xsp;
  -    xsp = jj_scanpos;
  -    if (jj_3R_182()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_183()) return true;
  +  final private boolean jj_3R_94() {
  +    if (jj_3R_103()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_180() {
  -    if (jj_3R_112()) return true;
  +  final private boolean jj_3R_84() {
  +    if (jj_scan_token(FUNCTION_NUMBER)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_178() {
  -    if (jj_3R_19()) return true;
  +  final private boolean jj_3R_93() {
  +    if (jj_scan_token(Number)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    Token xsp;
  -    while (true) {
  -      xsp = jj_scanpos;
  -      if (jj_3R_180()) { jj_scanpos = xsp; break; }
  -      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    }
  -    while (true) {
  -      xsp = jj_scanpos;
  -      if (jj_3R_181()) { jj_scanpos = xsp; break; }
  -      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    }
       return false;
     }
   
  -  final private boolean jj_3_6() {
  -    if (jj_3R_19()) return true;
  +  final private boolean jj_3R_83() {
  +    if (jj_scan_token(FUNCTION_LANG)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_177() {
  -    if (jj_3R_179()) return true;
  +  final private boolean jj_3R_92() {
  +    if (jj_scan_token(Literal)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_176() {
  -    if (jj_3R_178()) return true;
  +  final private boolean jj_3R_82() {
  +    if (jj_scan_token(FUNCTION_NULL)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_174() {
  -    Token xsp;
  -    xsp = jj_scanpos;
  -    if (jj_3R_176()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_177()) return true;
  +  final private boolean jj_3R_91() {
  +    if (jj_scan_token(75)) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    if (jj_3R_102()) return true;
  +    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    if (jj_scan_token(76)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_175() {
  -    if (jj_scan_token(UNION)) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_3R_174()) return true;
  +  final private boolean jj_3R_81() {
  +    if (jj_scan_token(FUNCTION_FALSE)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_173() {
  -    if (jj_3R_174()) return true;
  +  final private boolean jj_3R_90() {
  +    if (jj_3R_101()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    Token xsp;
  -    while (true) {
  -      xsp = jj_scanpos;
  -      if (jj_3R_175()) { jj_scanpos = xsp; break; }
  -      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    }
       return false;
     }
   
  -  final private boolean jj_3R_132() {
  -    if (jj_3R_100()) return true;
  +  final private boolean jj_3R_80() {
  +    if (jj_scan_token(FUNCTION_TRUE)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3_1() {
  -    if (jj_3R_15()) return true;
  -    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_scan_token(73)) return true;
  +  final private boolean jj_3R_79() {
  +    if (jj_scan_token(FUNCTION_NOT)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_133() {
  -    if (jj_scan_token(81)) return true;
  +  final private boolean jj_3R_118() {
  +    if (jj_3R_126()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_3R_132()) return true;
  +    return false;
  +  }
  +
  +  final private boolean jj_3R_78() {
  +    if (jj_scan_token(FUNCTION_BOOLEAN)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_135() {
  -    if (jj_3R_94()) return true;
  +  final private boolean jj_3R_77() {
  +    if (jj_scan_token(FUNCTION_TRANSLATE)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_123() {
  -    if (jj_3R_132()) return true;
  +  final private boolean jj_3R_76() {
  +    if (jj_scan_token(FUNCTION_NORMALIZE_SPACE)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    Token xsp;
  -    while (true) {
  -      xsp = jj_scanpos;
  -      if (jj_3R_133()) { jj_scanpos = xsp; break; }
  -      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    }
       return false;
     }
   
  -  final private boolean jj_3R_134() {
  -    if (jj_3R_15()) return true;
  +  final private boolean jj_3R_75() {
  +    if (jj_scan_token(FUNCTION_STRING_LENGTH)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_scan_token(73)) return true;
  +    return false;
  +  }
  +
  +  final private boolean jj_3R_19() {
  +    Token xsp;
  +    xsp = jj_scanpos;
  +    if (jj_3R_90()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_91()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_92()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_93()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_94()) {
  +    jj_scanpos = xsp;
  +    if (jj_3R_95()) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_3R_15()) return true;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  +    return false;
  +  }
  +
  +  final private boolean jj_3R_74() {
  +    if (jj_scan_token(FUNCTION_SUBSTRING)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_120() {
  -    if (jj_scan_token(73)) return true;
  +  final private boolean jj_3R_73() {
  +    if (jj_scan_token(FUNCTION_SUBSTRING_AFTER)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_3R_15()) return true;
  +    return false;
  +  }
  +
  +  final private boolean jj_3R_72() {
  +    if (jj_scan_token(FUNCTION_SUBSTRING_BEFORE)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_115() {
  -    if (jj_scan_token(74)) return true;
  +  final private boolean jj_3R_71() {
  +    if (jj_scan_token(FUNCTION_CONTAINS)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    Token xsp;
  -    xsp = jj_scanpos;
  -    if (jj_3R_123()) jj_scanpos = xsp;
  -    else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_scan_token(75)) return true;
  +    return false;
  +  }
  +
  +  final private boolean jj_3R_70() {
  +    if (jj_scan_token(FUNCTION_STARTS_WITH)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_124() {
  -    Token xsp;
  -    xsp = jj_scanpos;
  -    if (jj_3R_134()) {
  -    jj_scanpos = xsp;
  -    if (jj_3R_135()) return true;
  +  final private boolean jj_3R_69() {
  +    if (jj_scan_token(FUNCTION_CONCAT)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_113() {
  -    if (jj_3R_15()) return true;
  +  final private boolean jj_3R_68() {
  +    if (jj_scan_token(FUNCTION_STRING)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    Token xsp;
  -    xsp = jj_scanpos;
  -    if (jj_3R_120()) jj_scanpos = xsp;
  -    else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
   
  -  final private boolean jj_3R_101() {
  -    if (jj_3R_18()) return true;
  +  final private boolean jj_3R_67() {
  +    if (jj_scan_token(FUNCTION_NAME)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
  -    if (jj_3R_115()) return true;
  +    return false;
  +  }
  +
  +  final private boolean jj_3R_66() {
  +    if (jj_scan_token(FUNCTION_NAMESPACE_URI)) return true;
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
       return false;
     }
  @@ -3448,7 +3482,7 @@
     final private int[] jj_la1 = new int[39];
     final private int[] jj_la1_0 = {0x7f800000,0x7800000,0x0,0x0,0x7800000,0xff80000c,0xc,0x4,0xc,0xc,0x7f800000,0xff800000,0x0,0x80000000,0x80000000,0x0,0x16000,0x7f800000,0x0,0xff81604c,0x10,0xff80000c,0x0,0xc,0x800000,0x1000000,0x180,0x180,0x1e00,0x1e00,0x20,0x40,0x6000000,0x6000000,0xff81604c,0x7f800000,0x7f800000,0x0,0x78000000,};
     final private int[] jj_la1_1 = {0xfffff000,0x0,0xfffff000,0x0,0x0,0xffffffff,0x0,0x0,0x0,0x0,0xfffff000,0xffffffff,0x0,0xfff,0xfff,0x0,0x0,0xfffff000,0x0,0xffffffff,0x0,0xffffffff,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xffffffff,0xfffff000,0xfffff000,0x0,0x0,};
  -  final private int[] jj_la1_2 = {0x1ff,0x100,0xff,0x200,0x100,0x531ff,0x0,0x0,0x0,0x0,0x401ff,0x531ff,0x4000,0x0,0x0,0x10000,0x400,0x1ff,0x20000,0x535ff,0x0,0x531ff,0x4000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40000,0x40000,0x535ff,0x401ff,0x401ff,0x200,0x0,};
  +  final private int[] jj_la1_2 = {0x3ff,0x200,0x1ff,0x400,0x200,0xa63ff,0x0,0x0,0x0,0x0,0x803ff,0xa63ff,0x8000,0x0,0x0,0x20000,0x800,0x3ff,0x40000,0xa6bff,0x0,0xa63ff,0x8000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x80000,0x80000,0xa6bff,0x803ff,0x803ff,0x400,0x0,};
     final private JJCalls[] jj_2_rtns = new JJCalls[6];
     private boolean jj_rescan = false;
     private int jj_gc = 0;
  @@ -3606,8 +3640,8 @@
   
     final public ParseException generateParseException() {
       jj_expentries.removeAllElements();
  -    boolean[] la1tokens = new boolean[83];
  -    for (int i = 0; i < 83; i++) {
  +    boolean[] la1tokens = new boolean[84];
  +    for (int i = 0; i < 84; i++) {
         la1tokens[i] = false;
       }
       if (jj_kind >= 0) {
  @@ -3629,7 +3663,7 @@
           }
         }
       }
  -    for (int i = 0; i < 83; i++) {
  +    for (int i = 0; i < 84; i++) {
         if (la1tokens[i]) {
           jj_expentry = new int[1];
           jj_expentry[0] = i;
  
  
  
  1.3       +3 -4      jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/parser/XPath.jj
  
  Index: XPath.jj
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/parser/XPath.jj,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- XPath.jj	21 Sep 2001 23:22:44 -0000	1.2
  +++ XPath.jj	8 Jun 2002 22:47:24 -0000	1.3
  @@ -242,8 +242,6 @@
   |
       <DIV:    "div">
   |
  -//    <KEY:    "key">
  -//|
       <NODE:    "node">
   |
       <TEXT:    "text">
  @@ -271,6 +269,7 @@
   |   <FUNCTION_POSITION: "position">
   |   <FUNCTION_COUNT: "count">
   |   <FUNCTION_ID: "id">
  +|   <FUNCTION_KEY: "key">
   |   <FUNCTION_LOCAL_NAME: "local-name">
   |   <FUNCTION_NAMESPACE_URI: "namespace-uri">
   |   <FUNCTION_NAME: "name">
  @@ -339,7 +338,7 @@
       |   <FUNCTION_FLOOR>
       |   <FUNCTION_CEILING>
       |   <FUNCTION_ROUND>
  -//  |   <FUNCTION_KEY>
  +    |   <FUNCTION_KEY>
       )
       {
           return token.image;
  @@ -395,7 +394,7 @@
       |   <FUNCTION_FLOOR>            { code = Compiler.FUNCTION_FLOOR; }
       |   <FUNCTION_CEILING>          { code = Compiler.FUNCTION_CEILING; }
       |   <FUNCTION_ROUND>            { code = Compiler.FUNCTION_ROUND; }
  -//  |   <FUNCTION_KEY>              { code = Compiler.FUNCTION_KEY; }
  +    |   <FUNCTION_KEY>              { code = Compiler.FUNCTION_KEY; }
       )
       {
           return code;
  
  
  
  1.2       +2 -2      jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/parser/XPath.html
  
  Index: XPath.html
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/parser/XPath.html,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XPath.html	23 Aug 2001 00:47:00 -0000	1.1
  +++ XPath.html	8 Jun 2002 22:47:24 -0000	1.2
  @@ -10,7 +10,7 @@
   <TR>
   <TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod1">NCName</A></TD>
   <TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
  -<TD ALIGN=LEFT VALIGN=BASELINE>( <A HREF="#prod2">NCName_Without_CoreFunctions</A> | &lt;NODE&gt; | &lt;TEXT&gt; | &lt;COMMENT&gt; | &lt;PI&gt; | &lt;FUNCTION_LAST&gt; | &lt;FUNCTION_POSITION&gt; | &lt;FUNCTION_COUNT&gt; | &lt;FUNCTION_ID&gt; | &lt;FUNCTION_LOCAL_NAME&gt; | &lt;FUNCTION_NAMESPACE_URI&gt; | &lt;FUNCTION_NAME&gt; | &lt;FUNCTION_STRING&gt; | &lt;FUNCTION_CONCAT&gt; | &lt;FUNCTION_STARTS_WITH&gt; | &lt;FUNCTION_CONTAINS&gt; | &lt;FUNCTION_SUBSTRING_BEFORE&gt; | &lt;FUNCTION_SUBSTRING_AFTER&gt; | &lt;FUNCTION_SUBSTRING&gt; | &lt;FUNCTION_STRING_LENGTH&gt; | &lt;FUNCTION_NORMALIZE_SPACE&gt; | &lt;FUNCTION_TRANSLATE&gt; | &lt;FUNCTION_BOOLEAN&gt; | &lt;FUNCTION_NOT&gt; | &lt;FUNCTION_TRUE&gt; | &lt;FUNCTION_FALSE&gt; | &lt;FUNCTION_LANG&gt; | &lt;FUNCTION_NUMBER&gt; | &lt;FUNCTION_SUM&gt; | &lt;FUNCTION_FLOOR&gt; | &lt;FUNCTION_CEILING&gt; | &lt;FUNCTION_ROUND&gt; )</TD>
  +<TD ALIGN=LEFT VALIGN=BASELINE>( <A HREF="#prod2">NCName_Without_CoreFunctions</A> | &lt;NODE&gt; | &lt;TEXT&gt; | &lt;COMMENT&gt; | &lt;PI&gt; | &lt;FUNCTION_LAST&gt; | &lt;FUNCTION_POSITION&gt; | &lt;FUNCTION_COUNT&gt; | &lt;FUNCTION_ID&gt; | &lt;FUNCTION_LOCAL_NAME&gt; | &lt;FUNCTION_NAMESPACE_URI&gt; | &lt;FUNCTION_NAME&gt; | &lt;FUNCTION_STRING&gt; | &lt;FUNCTION_CONCAT&gt; | &lt;FUNCTION_STARTS_WITH&gt; | &lt;FUNCTION_CONTAINS&gt; | &lt;FUNCTION_SUBSTRING_BEFORE&gt; | &lt;FUNCTION_SUBSTRING_AFTER&gt; | &lt;FUNCTION_SUBSTRING&gt; | &lt;FUNCTION_STRING_LENGTH&gt; | &lt;FUNCTION_NORMALIZE_SPACE&gt; | &lt;FUNCTION_TRANSLATE&gt; | &lt;FUNCTION_BOOLEAN&gt; | &lt;FUNCTION_NOT&gt; | &lt;FUNCTION_TRUE&gt; | &lt;FUNCTION_FALSE&gt; | &lt;FUNCTION_NULL&gt; | &lt;FUNCTION_LANG&gt; | &lt;FUNCTION_NUMBER&gt; | &lt;FUNCTION_SUM&gt; | &lt;FUNCTION_FLOOR&gt; | &lt;FUNCTION_CEILING&gt; | &lt;FUNCTION_ROUND&gt; | &lt;FUNCTION_KEY&gt; )</TD>
   </TR>
   <TR>
   <TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod2">NCName_Without_CoreFunctions</A></TD>
  @@ -20,7 +20,7 @@
   <TR>
   <TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod3">CoreFunctionName</A></TD>
   <TD ALIGN=CENTER VALIGN=BASELINE>::=</TD>
  -<TD ALIGN=LEFT VALIGN=BASELINE>( &lt;FUNCTION_LAST&gt; | &lt;FUNCTION_POSITION&gt; | &lt;FUNCTION_COUNT&gt; | &lt;FUNCTION_ID&gt; | &lt;FUNCTION_LOCAL_NAME&gt; | &lt;FUNCTION_NAMESPACE_URI&gt; | &lt;FUNCTION_NAME&gt; | &lt;FUNCTION_STRING&gt; | &lt;FUNCTION_CONCAT&gt; | &lt;FUNCTION_STARTS_WITH&gt; | &lt;FUNCTION_CONTAINS&gt; | &lt;FUNCTION_SUBSTRING_BEFORE&gt; | &lt;FUNCTION_SUBSTRING_AFTER&gt; | &lt;FUNCTION_SUBSTRING&gt; | &lt;FUNCTION_STRING_LENGTH&gt; | &lt;FUNCTION_NORMALIZE_SPACE&gt; | &lt;FUNCTION_TRANSLATE&gt; | &lt;FUNCTION_BOOLEAN&gt; | &lt;FUNCTION_NOT&gt; | &lt;FUNCTION_TRUE&gt; | &lt;FUNCTION_FALSE&gt; | &lt;FUNCTION_LANG&gt; | &lt;FUNCTION_NUMBER&gt; | &lt;FUNCTION_SUM&gt; | &lt;FUNCTION_FLOOR&gt; | &lt;FUNCTION_CEILING&gt; | &lt;FUNCTION_ROUND&gt; )</TD>
  +<TD ALIGN=LEFT VALIGN=BASELINE>( &lt;FUNCTION_LAST&gt; | &lt;FUNCTION_POSITION&gt; | &lt;FUNCTION_COUNT&gt; | &lt;FUNCTION_ID&gt; | &lt;FUNCTION_LOCAL_NAME&gt; | &lt;FUNCTION_NAMESPACE_URI&gt; | &lt;FUNCTION_NAME&gt; | &lt;FUNCTION_STRING&gt; | &lt;FUNCTION_CONCAT&gt; | &lt;FUNCTION_STARTS_WITH&gt; | &lt;FUNCTION_CONTAINS&gt; | &lt;FUNCTION_SUBSTRING_BEFORE&gt; | &lt;FUNCTION_SUBSTRING_AFTER&gt; | &lt;FUNCTION_SUBSTRING&gt; | &lt;FUNCTION_STRING_LENGTH&gt; | &lt;FUNCTION_NORMALIZE_SPACE&gt; | &lt;FUNCTION_TRANSLATE&gt; | &lt;FUNCTION_BOOLEAN&gt; | &lt;FUNCTION_NOT&gt; | &lt;FUNCTION_TRUE&gt; | &lt;FUNCTION_FALSE&gt; | &lt;FUNCTION_NULL&gt; | &lt;FUNCTION_LANG&gt; | &lt;FUNCTION_NUMBER&gt; | &lt;FUNCTION_SUM&gt; | &lt;FUNCTION_FLOOR&gt; | &lt;FUNCTION_CEILING&gt; | &lt;FUNCTION_ROUND&gt; | &lt;FUNCTION_KEY&gt; )</TD>
   </TR>
   <TR>
   <TD ALIGN=RIGHT VALIGN=BASELINE><A NAME="prod4">QName</A></TD>
  
  
  
  1.3       +13 -0     jakarta-commons/jxpath/src/test/org/apache/commons/jxpath/Vendor.xml
  
  Index: Vendor.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/jxpath/src/test/org/apache/commons/jxpath/Vendor.xml,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- Vendor.xml	29 May 2002 00:42:07 -0000	1.2
  +++ Vendor.xml	8 Jun 2002 22:47:24 -0000	1.3
  @@ -1,4 +1,17 @@
   <?xml version="1.0" ?>
  +
  +<!DOCTYPE vendor [
  +  <!ELEMENT vendor (location, contact, product)>
  +  <!ELEMENT location ANY>
  +  <!ATTLIST location
  +      id ID #REQUIRED
  +      name CDATA #IMPLIED
  +      manager CDATA #IMPLIED
  +  >
  +  <!ELEMENT contact ANY>
  +  <!ELEMENT product ANY>
  +]>
  +
   <vendor>
     <contact>John</contact>
     <contact>Jack</contact>
  
  
  
  1.22      +59 -20    jakarta-commons/jxpath/src/test/org/apache/commons/jxpath/JXPathTestCase.java
  
  Index: JXPathTestCase.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/jxpath/src/test/org/apache/commons/jxpath/JXPathTestCase.java,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- JXPathTestCase.java	30 May 2002 01:57:35 -0000	1.21
  +++ JXPathTestCase.java	8 Jun 2002 22:47:24 -0000	1.22
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-commons/jxpath/src/test/org/apache/commons/jxpath/JXPathTestCase.java,v 1.21 2002/05/30 01:57:35 dmitri Exp $
  - * $Revision: 1.21 $
  - * $Date: 2002/05/30 01:57:35 $
  + * $Header: /home/cvs/jakarta-commons/jxpath/src/test/org/apache/commons/jxpath/JXPathTestCase.java,v 1.22 2002/06/08 22:47:24 dmitri Exp $
  + * $Revision: 1.22 $
  + * $Date: 2002/06/08 22:47:24 $
    *
    * ====================================================================
    * The Apache Software License, Version 1.1
  @@ -95,7 +95,7 @@
    * </p>
    *
    * @author Dmitri Plotnikov
  - * @version $Revision: 1.21 $ $Date: 2002/05/30 01:57:35 $
  + * @version $Revision: 1.22 $ $Date: 2002/06/08 22:47:24 $
    */
   
   public class JXPathTestCase extends TestCase
  @@ -165,7 +165,9 @@
        * Test property iterators, the core of the graph traversal engine
        */
       public void testIndividualIterators(){
  -        if (true){
  +        if (!enabled){
  +            return;
  +        }
   //        testIndividual(0, 0, true, false, 3);
               testIndividual(+1, 0, true, false, 0);
               testIndividual(-1, 0, true, false, 4);
  @@ -179,7 +181,6 @@
   
               testIndividual(0, 0, false, false, 4);
               testIndividual(0, 0, false, true, 4);
  -        }
       }
   
       private void testIndividual(int relativePropertyIndex, int offset, boolean useStartLocation, boolean reverse, int expected){
  @@ -206,7 +207,9 @@
       }
   
       public void testMultipleIterators(){
  -        if (true){
  +        if (!enabled){
  +            return;
  +        }
               testMultiple(0, 0, true, false, 20);
   
               testMultiple(3, 0, true, false, 16);
  @@ -217,7 +220,6 @@
   
               testMultiple(3, 1, true, false, 15);
               testMultiple(3, 3, true, false, 13);
  -        }
       }
   
       private void testMultiple(int propertyIndex, int offset, boolean useStartLocation, boolean reverse, int expected){
  @@ -309,8 +311,15 @@
           JXPathContext context = JXPathContext.newContext(map);
           testIterate(context, "foo", list("a", "b", "c"));
   
  -//        context = JXPathContext.newContext(bean);
  -//        testIterate(context, "nestedBean/strings[2]/following::node()", null);
  +        context = JXPathContext.newContext(bean);
  +        Iterator it = context.iteratePointers("/integers");
  +        List actual = new ArrayList();
  +        for (int i = 0; i < 4; i++){
  +            actual.add(it.next().toString());
  +        }
  +        assertEquals("Iterating <" + "/integers" + ">",
  +            list("/integers[1]", "/integers[2]", "/integers[3]", "/integers[4]"),
  +            actual);
       }
   
       private void testIterate(JXPathContext context, String xpath, List expected) {
  @@ -431,9 +440,9 @@
       }
   
       public void testDocumentOrder(){
  -//        if (!enabled){
  -//            return;
  -//        }
  +        if (!enabled){
  +            return;
  +        }
   
           JXPathContext context = JXPathContext.newContext(createTestBeanWithDOM());
   
  @@ -791,6 +800,33 @@
                       context.getValue("count(vendor/location[@id = '100']/@name)"));
       }
   
  +    public void testIDAndKey(){
  +        if (!enabled){
  +            return;
  +        }
  +        JXPathContext context = JXPathContext.newContext(createTestBeanWithDOM());
  +        context.setIdentityManager(new IdentityManager(){
  +            public Pointer getPointerByID(JXPathContext context, String id){
  +                NodePointer ptr = (NodePointer)context.getPointer("/vendor");
  +                return ptr.getPointerByID(context, id);
  +            }
  +        });
  +        context.setKeyManager(new KeyManager(){
  +            public Pointer getPointerByKey(JXPathContext context,
  +                                            String key, String value){
  +                return NodePointer.newNodePointer(null, "42", null);
  +            }
  +        });
  +        assertEquals("Test ID", "Tangerine Drive",
  +            context.getValue("id(101)//street"));
  +        assertEquals("Test ID Path", "id('101')/address[1]/street[1]",
  +            context.getPointer("id(101)//street").asPath());
  +        assertEquals("Test ID Path Null", "id(105)/address[1]/street",
  +            context.getPointer("id(105)/address/street").asPath());
  +        assertEquals("Test key", "42",
  +            context.getValue("key('a', 'b')"));
  +    }
  +
       public void testNull(){
           if (!enabled){
               return;
  @@ -1150,7 +1186,7 @@
           test("integers[position() = last() - 1]", new Integer(3)),
           testEval("integers[position() < 3]", list(new Integer(1), new Integer(2))),
           test("count(beans/strings)", new Double(6)),
  -        test("integers[string() = '2.0']", new Integer(2)),
  +        test("integers[string() = '2']", new Integer(2)),
   
           test("name(integers)", "integers"),
           testEval("*[name(.) = 'integers']", list(new Integer(1), new Integer(2), new Integer(3), new Integer(4))),
  @@ -1165,7 +1201,7 @@
           testPath("map[@name = 'Key&quot;&apos;&quot;&apos;1']", "/map[@name='Key&quot;&apos;&quot;&apos;1']"),
   
           // Standard functions
  -        test("string(2)", "2.0"),
  +        test("string(2)", "2"),
           test("string($nan)", "NaN"),
           test("string(-$nan)", "NaN"),
           test("string(-2 div 0)", "-Infinity"),
  @@ -1224,14 +1260,14 @@
           test("string(" + TestFunctions.class.getName() + ".new())", "foo=0; bar=null"),
           test("string(test:new(3, 'baz'))", "foo=3; bar=baz"),
           test("string(test:new('3', 4))", "foo=3; bar=4.0"),
  -        test("string(test:getFoo($test))", "4.0"),
  -        test("string(call:getFoo($test))", "4.0"),
  -        test("string(getFoo($test))", "4.0"),
  +        test("string(test:getFoo($test))", "4"),
  +        test("string(call:getFoo($test))", "4"),
  +        test("string(getFoo($test))", "4"),
           test("string(test:setFooAndBar($test, 7, 'biz'))", "foo=7; bar=biz"),
           test("string(test:build(8, 'goober'))", "foo=8; bar=goober"),
           test("string(jxpathtest:TestFunctions.build(8, 'goober'))", "foo=8; bar=goober"),
           test("string(" + TestFunctions.class.getName() + ".build(8, 'goober'))", "foo=8; bar=goober"),
  -        test("string(test:increment(8))", "9.0"),
  +        test("string(test:increment(8))", "9"),
           test("length('foo')", new Integer(3)),
           test("call:substring('foo', 1, 2)", "o"),
           test("//.[test:isMap()]/Key1", "Value 1"),
  @@ -1417,7 +1453,10 @@
   
           testEval("vendor/contact/following::location//street",
               list("Orchard Road", "Tangerine Drive")),
  -    };
  +
  +        test("id('101')//street", "Tangerine Drive"),
  +        testPath("id('101')//street", "id('101')/address[1]/street[1]"),
  +   };
   
       public void testTypeConversions(){
           for (int i=0; i < typeConversionTests.length; i++) {
  
  
  
  1.7       +1153 -739 jakarta-commons/jxpath/xdocs/users-guide.xml
  
  Index: users-guide.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/jxpath/xdocs/users-guide.xml,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- users-guide.xml	8 May 2002 00:39:29 -0000	1.6
  +++ users-guide.xml	8 Jun 2002 22:47:24 -0000	1.7
  @@ -1,120 +1,154 @@
  -<?xml version="1.0"?>
  -
  +<?xml version="1.0" encoding="UTF-8"?>
   <document>
  +  <properties>
  +    <title>
  +       JXPath User's Guide
  +    </title>
  +    <author email="dmitri@apache.org">
  +       Dmitri Plotnikov
  +    </author>
  +  </properties>
  +  <body>
  +
  +
  +    <section name="What's JXPath">
  +      <p>
  +        JXPath provides APIs for the traversal of graphs of JavaBeans,
  +        DOM and other types of objects using the XPath syntax.
  +      </p>
  +      <p>
  +        If you are not familiar with the XPath syntax, start with
  +        <a href="http://www.w3schools.com/xpath">XPath Tutorial by W3Schools</a>.
  +        <br/>
  +         Also see
  +        <a href="http://www.w3.org/TR/xpath">XML Path Language (XPath) Version 1.0</a> -
  +        that's the official standard.
  +      </p>
  +      <p>
  +        XPath is the official expression language of XSLT. In XSLT you
  +        mostly use XPath to access various elements of XML documents.
  +        You can do that with JXPath as well. In addition, you can read
  +        and write properties of JavaBeans, get and set elements of
  +        arrays, collections, maps, transparent containers, various
  +        context objects in Servlets etc. In other words, JXPath applies
  +        the concepts of XPath to alternate object models.
  +      </p>
  +      <p>
  +        You can also have JXPath create new objects if needed.
  +      </p>
  +      <p>
  +        The central class in the JXPath architecture is
  +        <a href="api/org/apache/commons/jxpath/JXPathContext.html"><code>JXPathContext</code></a>.
  +        Most of the APIs discussed in this document have to do with the
  +        JXPathContext class.
  +      </p>
  +      <ul>
  +        <li><a href="#Object Graph Traversal">Object Graph Traversal</a>
  +          <ul>
  +            <li><a href="#JavaBean Property Access">JavaBean Property Access</a>
  +            </li>
  +            <li><a href="#Lenient Mode">Lenient Mode</a>
  +            </li>
  +            <li><a href="#Nested Bean Property Access">Nested Bean Property Access</a>
  +            </li>
  +            <li><a href="#Collection Subscripts">Collection Subscripts</a>
  +            </li>
  +            <li><a href="#Retrieving Multiple Results">Retrieving Multiple Results</a>
  +            </li>
  +            <li><a href="#Map Element Access">Map Element Access</a>
  +            </li>
  +            <li><a href="#DOM Document Access">DOM Document Access</a>
  +            </li>
  +            <li><a href="#Containers">Containers</a>
  +            </li>
  +            <li><a href="#Functions id() and key()">Functions id() and key()</a>
  +            </li>
  +          </ul>
  +        </li>
  +        <li><a href="#Modifying Object Graphs">Modifying Object Graphs</a>
  +          <ul>
  +            <li><a href="#Setting Properties">Setting Properties</a>
  +            </li>
  +            <li><a href="#Creating Objects">Creating Objects</a>
  +            </li>
  +          </ul>
  +        </li>
  +        <li><a href="#Variables">Variables</a>
  +          <ul>
  +            <li><a href="#Custom Variable Pools">Custom Variable Pools</a>
  +            </li>
  +          </ul>
  +        </li>
  +        <li><a href="#Servlet Contexts">Servlet Contexts</a>
  +          <ul>
  +            <li><a href="#JSP Page Context">JSP Page Context</a>
  +            </li>
  +            <li><a href="#Servlet Request Context">Servlet Request Context</a>
  +            </li>
  +            <li><a href="#HttpSession Context">HttpSession Context</a>
  +            </li>
  +            <li><a href="#ServletContext Context">ServletContext Context</a>
  +            </li>
  +          </ul>
  +        </li>
  +        <li><a href="#Pointers">Pointers</a>
  +        </li>
  +        <li><a href="#Extension Functions">Extension Functions</a>
  +          <ul>
  +            <li><a href="#Standard Extension Functions">Standard Extension Functions</a>
  +            </li>
  +            <li><a href="#Custom Extension Functions">Custom Extension Functions</a>
  +            </li>
  +            <li><a href="#Expression Context">Expression Context</a>
  +            </li>
  +          </ul>
  +        </li>
  +        <li><a href="#Type Conversions">Type Conversions</a>
  +        </li>
  +        <li><a href="#Internationalization">Internationalization</a>
  +        </li>
  +        <li><a href="#Nested Contexts">Nested Contexts</a>
  +        </li>
  +        <li><a href="#Compiled Expressions">Compiled Expressions</a>
  +        </li>
  +        <li><a href="#Customizing JXPath">Customizing JXPath</a>
  +          <ul>
  +            <li><a href="#Custom JXPathBeanInfo">Custom JXPathBeanInfo</a>
  +            </li>
  +            <li><a href="#Custom DynamicPropertyHandler">Custom DynamicPropertyHandler</a>
  +            </li>
  +            <li><a href="#Custom Pointers and Iterators">Custom Pointers and Iterators</a>
  +            </li>
  +            <li><a href="#Alternative JXPath Implementation">Alternative JXPath Implementation</a>
  +            </li>
  +          </ul>
  +        </li>
  +        <li><a href="#Miscellaneous">Miscellaneous</a>
  +        </li>
  +      </ul>
  +    </section>
  +
  +
  +    <section name="Object Graph Traversal">
  +      <p>
  +        JXPath uses JavaBeans introspection to enumerate and access
  +        JavaBeans properties.
  +      </p>
  +      <p>
  +        The interpretation of the XPath syntax in the context of Java
  +        object graphs is quite intuitive: the <code>"child"</code>
  +        axis of XPath is mapped to JavaBean properties.
  +      </p>
  +
  +
  +      <subsection name="JavaBean Property Access">
  +        <p>
  +          JXPath can be used to access properties of a JavaBean.
  +        </p>
   
  - <properties>
  -  <title>JXPath User's Guide</title>
  -  <author email="dmitri@apache.org">Dmitri Plotnikov</author>
  - </properties>
  -
  - <body>
  -
  -<section name="What's JXPath">
  -
  -    <p>
  -     JXPath provides APIs for the traversal of graphs of JavaBeans, DOM and
  -     other types of objects using the XPath syntax.
  -    </p>
  -
  -    <p>
  -     If you are not familiar with the XPath syntax, start with
  -     <a href="http://www.w3schools.com/xpath">XPath Tutorial by W3Schools</a>.<br/>
  -     Also see <a href="http://www.w3.org/TR/xpath">XML Path Language (XPath) Version 1.0 </a> -
  -     that's the official standard.
  -    </p>
  -
  -    <p>
  -     XPath is the official expression language of XSLT. In XSLT you mostly use
  -     XPath to access various elements of XML documents.  You can do that with
  -     JXPath as well. In addition, you can read and write properties of JavaBeans, get and set
  -     elements of arrays, collections, maps, transparent containers, various context objects
  -     in Servlets etc.  In other words, JXPath applies the concepts of XPath
  -     to alternate object models.
  -    </p>
  -
  -    <p>
  -     You can also have JXPath create new objects if needed.
  -    </p>
  -
  -    <p>
  -     The central class in the JXPath architecture is
  -     <a href="api/org/apache/commons/jxpath/JXPathContext.html"><code>JXPathContext</code></a>. Most of the
  -     APIs discussed in this document have to do with the JXPathContext class.
  -    </p>
  -<ul>
  -  <li><a href="#Object Graph Traversal">Object Graph Traversal</a>
  -     <ul>
  -       <li><a href="#JavaBean Property Access">JavaBean Property Access</a></li>
  -       <li><a href="#Lenient Mode">Lenient Mode</a></li>
  -       <li><a href="#Nested Bean Property Access">Nested Bean Property Access</a></li>
  -       <li><a href="#Collection Subscripts">Collection Subscripts</a></li>
  -       <li><a href="#Retrieving Multiple Results">Retrieving Multiple Results</a></li>
  -       <li><a href="#Map Element Access">Map Element Access</a></li>
  -       <li><a href="#DOM Document Access">DOM Document Access</a></li>
  -       <li><a href="#Containers">Containers</a></li>
  -     </ul>
  -  </li>
  -  <li><a href="#Modifying Object Graphs">Modifying Object Graphs</a>
  -     <ul>
  -       <li><a href="#Setting Properties">Setting Properties</a></li>
  -       <li><a href="#Creating Objects">Creating Objects</a></li>
  -     </ul>
  -  </li>
  -  <li><a href="#Variables">Variables</a>
  -     <ul>
  -       <li><a href="#Custom Variable Pools">Custom Variable Pools</a></li>
  -     </ul>
  -  </li>
  -  <li><a href="#Servlet Contexts">Servlet Contexts</a>
  -     <ul>
  -       <li><a href="#JSP Page Context">JSP Page Context</a></li>
  -       <li><a href="#Servlet Request Context">Servlet Request Context</a></li>
  -       <li><a href="#HttpSession Context">HttpSession Context</a></li>
  -       <li><a href="#ServletContext Context">ServletContext Context</a></li>
  -     </ul>
  -  </li>
  -  <li><a href="#Pointers">Pointers</a></li>
  -  <li><a href="#Extension Functions">Extension Functions</a>
  -     <ul>
  -       <li><a href="#Standard Extension Functions">Standard Extension Functions</a></li>
  -       <li><a href="#Custom Extension Functions">Custom Extension Functions</a></li>
  -       <li><a href="#Expression Context">Expression Context</a></li>
  -     </ul>
  -  </li>
  -  <li><a href="#Type Conversions">Type Conversions</a></li>
  -  <li><a href="#Internationalization">Internationalization</a></li>
  -  <li><a href="#Nested Contexts">Nested Contexts</a></li>
  -  <li><a href="#Compiled Expressions">Compiled Expressions</a></li>
  -  <li><a href="#Customizing JXPath">Customizing JXPath</a>
  -     <ul>
  -       <li><a href="#Custom JXPathBeanInfo">Custom JXPathBeanInfo</a></li>
  -       <li><a href="#Custom DynamicPropertyHandler">Custom DynamicPropertyHandler</a></li>
  -       <li><a href="#Custom Pointers and Iterators">Custom Pointers and Iterators</a></li>
  -       <li><a href="#Alternative JXPath Implementation">Alternative JXPath Implementation</a></li>
  -     </ul>
  -  </li>
  -  <li><a href="#Miscellaneous">Miscellaneous</a></li>
  -</ul>
  -
  -</section>
  -
  -<section name="Object Graph Traversal">
  -    <p>
  -     JXPath uses JavaBeans introspection to enumerate and access JavaBeans
  -     properties.
  -    </p>
  -    <p>
  -     The interpretation of the XPath syntax in the context of Java object graphs
  -     is quite intuitive: the <code>"child"</code> axis of XPath is mapped to
  -     JavaBean properties.
  -    </p>
  -
  -<subsection name="JavaBean Property Access">
  - <p>
  -    JXPath can be used to access properties of a JavaBean.
  - </p>
  +<!--============================ + SOURCE + ============================-->
   <source>
  -                                                                       <b></b>
  +                                                                       <b/>
   public class Employee {
       public String getFirstName(){
          ...
  @@ -127,29 +161,37 @@
   JXPathContext context = JXPathContext.newContext(emp);
   String fName = (String)context.getValue("firstName");
   </source>
  +<!--============================ - SOURCE - ============================-->
  +
  +        <p>
  +          In this example, we are using JXPath to access a property
  +          of the <code>emp</code>  bean. In this simple case the
  +          invocation of JXPath is equivalent to invocation of
  +          <code>getFirstName()</code>  on the bean.
  +        </p>
  +      </subsection>
   
  -<p>
  -     In this example, we are using JXPath to access a property of the <code>emp</code> bean.
  -     In this simple case the invocation of JXPath is equivalent to invocation of
  -     <code>getFirstName()</code> on the bean.
  -</p>
  -</subsection>
  -
  -<subsection name="Lenient Mode">
  -<p>
  -The <code>context.getValue(xpath)</code> method throws an exception if the
  -supplied xpath does not map to an existing property.  This
  -constraint can be relaxed by calling <code>context.setLenient(true)</code>.
  -In the lenient mode the method merely returns null if the path maps to nothing.
  -</p>
  -</subsection>
  -
  -<subsection name="Nested Bean Property Access">
  - <p>
  - JXPath can traverse object graphs:
  - </p>
  - <source>
  -                                                                       <b></b>
  +
  +      <subsection name="Lenient Mode">
  +        <p>
  +          The <code>context.getValue(xpath)</code>  method throws
  +          an exception if the supplied xpath does not map to an
  +          existing property. This constraint can be relaxed by
  +          calling <code>context.setLenient(true)</code>. In the
  +          lenient mode the method merely returns null if the path
  +          maps to nothing.
  +        </p>
  +      </subsection>
  +
  +
  +      <subsection name="Nested Bean Property Access">
  +        <p>
  +          JXPath can traverse object graphs:
  +        </p>
  +
  +<!--============================ + SOURCE + ============================-->
  +<source>
  +                                                                       <b/>
    public class Employee {
       public Address getHomeAddress(){
          ...
  @@ -167,25 +209,36 @@
    JXPathContext context = JXPathContext.newContext(emp);
    String sNumber = (String)context.getValue("homeAddress/streetNumber");
    </source>
  - <p>
  - In this case XPath is used to access a property of a nested bean.
  - </p>
  - <p>
  - A property identified by the XPath does not have to be a "leaf" property.
  - For instance, we can extract the whole Address object in above example:
  - </p>
  - <source>
  -                                                                       <b></b>
  +<!--============================ - SOURCE - ============================-->
  +
  +        <p>
  +          In this case XPath is used to access a property of a nested
  +          bean.
  +        </p>
  +        <p>
  +          A property identified by the XPath does not have to be a
  +          "leaf" property. For instance, we can extract the whole
  +          Address object in above example:
  +        </p>
  +
  +<!--============================ + SOURCE + ============================-->
  +<source>
  +                                                                       <b/>
       Address addr = (Address)context.getValue("homeAddress");
    </source>
  - </subsection>
  +<!--============================ - SOURCE - ============================-->
  +
  +      </subsection>
  +
  +
  +      <subsection name="Collection Subscripts">
  +        <p>
  +          JXPath can extract elements from arrays and collections.
  +        </p>
   
  -<subsection name="Collection Subscripts">
  - <p>
  -  JXPath can extract elements from arrays and collections.
  - </p>
  - <source>
  -                                                                       <b></b>
  +<!--============================ + SOURCE + ============================-->
  +<source>
  +                                                                       <b/>
    public class Integers {
       public int[] getNumbers(){
          ...
  @@ -198,21 +251,29 @@
    JXPathContext context = JXPathContext.newContext(ints);
    Integer thirdInt = (Integer)context.getValue("numbers[3]");
    </source>
  - <p>
  -  A collection can be an arbitrary array or an instance of java.util.Collection.
  - </p>
  - <p>
  -  <b>Note:</b> in XPath the first element of a collection has index 1, not 0.<br/>
  - </p>
  -</subsection>
  -
  -<subsection name="Retrieving Multiple Results">
  - <p>
  - JXPath can retrieve multiple objects from a graph. Note that the method
  - called in this case is not <code>getValue</code>, but <code>iterate</code>.
  - </p>
  - <source>
  -                                                                       <b></b>
  +<!--============================ - SOURCE - ============================-->
  +
  +        <p>
  +          A collection can be an arbitrary array or an instance of
  +          java.util.Collection.
  +        </p>
  +        <p><b>Note:</b>  in XPath the first element of a collection has
  +          index 1, not 0.
  +          <br/>
  +        </p>
  +      </subsection>
  +
  +
  +      <subsection name="Retrieving Multiple Results">
  +        <p>
  +          JXPath can retrieve multiple objects from a graph. Note
  +          that the method called in this case is not <code>getValue</code>,
  +          but <code>iterate</code>.
  +        </p>
  +
  +<!--============================ + SOURCE + ============================-->
  +<source>
  +                                                                       <b/>
    public class Author {
       public Book[] getBooks(){
          ...
  @@ -225,18 +286,23 @@
    JXPathContext context = JXPathContext.newContext(auth);
    Iterator threeBooks = context.iterate("books[position() &lt; 4]");
    </source>
  - <p>
  - This returns a list of at most three books from the array of all books
  - written by the author.
  - </p>
  -</subsection>
  -
  -<subsection name="Map Element Access">
  - <p>
  -  JXPath supports maps. To get a value use its key.
  - </p>
  - <source>
  -                                                                       <b></b>
  +<!--============================ - SOURCE - ============================-->
  +
  +        <p>
  +          This returns a list of at most three books from the array
  +          of all books written by the author.
  +        </p>
  +      </subsection>
  +
  +
  +      <subsection name="Map Element Access">
  +        <p>
  +          JXPath supports maps. To get a value use its key.
  +        </p>
  +
  +<!--============================ + SOURCE + ============================-->
  +<source>
  +                                                                       <b/>
    public class Employee {
       private Map addressMap = new HashMap();
       {
  @@ -255,81 +321,98 @@
    String homeZipCode =
           (String)context.getValue("addresses/home/zipCode");
    </source>
  +<!--============================ - SOURCE - ============================-->
  +
  +        <p>
  +          Often you will need to use the alternative syntax for
  +          accessing Map elements:
  +        </p>
   
  - <p>
  - Often you will need to use the alternative syntax for accessing Map
  - elements:
  - </p>
  - <source>
  -                                                                       <b></b>
  +<!--============================ + SOURCE + ============================-->
  +<source>
  +                                                                       <b/>
    String homeZipCode = (String)context.
           getValue("addresses[@name='home']/zipCode");
    </source>
  -<p>
  - Unlike a child name in XPath,
  - the value of the "name" attribute does <em>not</em> have to be a properly formed
  - identifier.  Also, in this case the key can be an expression, e.g. a variable.
  -</p>
  -<p>
  - The attribute "name" can be used not only with Maps, but with JavaBeans
  - as well. The value of this attribute represents the name of a property.
  -</p>
  -
  -<p>
  - <b>Note:</b> At this point JXPath only supports Maps that use strings for keys.
  -</p>
  -<p>
  - <b>Note:</b> JXPath supports the extended notion of Map: any object with
  -   dynamic properties can be handled by JXPath provided that its
  -   class is registered with the
  -   <a href="api/org/apache/commons/jxpath/JXPathIntrospector.html"><code>JXPathIntrospector</code></a>.
  -</p>
  -</subsection>
  -
  -<subsection name="DOM Document Access">
  -<p>
  -JXPath supports access to DOM Nodes. The DOM node can be the
  -context node of JXPathContext or it can be a value of a property,
  -element of a collection,
  -variable value etc.  Let's say we have a path
  -<code>"$foo/bar/baz"</code>. It will work
  -if, for instance, the value of the variable "foo" is a
  -JavaBean, whose property "bar" contains a DOM Node,
  -which has a child element named "baz".
  -</p>
  -<p>
  -The intepretation of XPath over DOM structures is
  -implemented in with the XPath specification. For
  -instance, the "attribute" axis is supported for
  -DOM objects, even though it is not applicable to JavaBeans.
  -</p>
  -</subsection>
  -
  -<subsection name="Containers">
  -<p>
  - A <a href="api/org/apache/commons/jxpath/Container.html">Container</a> is an
  - object implementing an indirection mechanism transparent to JXPath.
  -</p>
  -<p>
  - For example, if property <code>"foo"</code> of the context node has a Container
  - as its value, the XPath "foo" will produce the contents of that Container,
  - not the container itself.
  -</p>
  -<p>
  - An example of a useful container is
  - <a href="api/org/apache/commons/jxpath/XMLDocumentContainer.html">XMLDocumentContainer</a>.
  - When you create an XMLDocumentContainer, you give it a pointer to an XML file
  - (a <code>URL</code> or a <code>javax.xml.transform.Source</code>.
  - It will read and parse the XML file only when it is
  - accessed.  You can create XMLDocumentContainers for various XML documents
  - that may or may not be accessed by XPaths.  If they are, they will be automatically
  - read, parsed and traversed. If they are not - they won't be read at all.
  -</p>
  -<p>
  -Let's say we have the the following XML file, which is stored as a Java resource.
  -</p>
  +<!--============================ - SOURCE - ============================-->
  +
  +        <p>
  +          Unlike a child name in XPath, the value of the "name"
  +          attribute does
  +          <em>
  +            not
  +          </em>
  +           have to be a properly formed identifier. Also,
  +          in this case the key can be an expression, e.g. a variable.
  +        </p>
  +        <p>
  +          The attribute "name" can be used not only with Maps, but
  +          with JavaBeans as well. The value of this attribute
  +          represents the name of a property.
  +        </p>
  +        <p><b>Note:</b>  At this point JXPath only supports Maps that use
  +          strings for keys.
  +        </p>
  +        <p><b>Note:</b>  JXPath supports the extended notion of Map: any
  +          object with dynamic properties can be handled by JXPath
  +          provided that its class is registered with the
  +          <a href="api/org/apache/commons/jxpath/JXPathIntrospector.html"><code>JXPathIntrospector</code></a>.
  +        </p>
  +      </subsection>
  +
  +
  +      <subsection name="DOM Document Access">
  +        <p>
  +          JXPath supports access to DOM Nodes. The DOM node can be
  +          the context node of JXPathContext or it can be a value of a
  +          property, element of a collection, variable value etc.
  +          Let's say we have a path <code>"$foo/bar/baz"</code>.
  +          It will work if, for instance, the value of the variable
  +          "foo" is a JavaBean, whose property "bar" contains a DOM
  +          Node, which has a child element named "baz".
  +        </p>
  +        <p>
  +          The intepretation of XPath over DOM structures is
  +          implemented in with the XPath specification. For instance,
  +          the "attribute" axis is supported for DOM objects, even
  +          though it is not applicable to JavaBeans.
  +        </p>
  +      </subsection>
  +
  +
  +      <subsection name="Containers">
  +        <p>
  +          A
  +          <a href="api/org/apache/commons/jxpath/Container.html">Container</a>
  +          is an object implementing an indirection mechanism
  +          transparent to JXPath.
  +        </p>
  +        <p>
  +          For example, if property <code>"foo"</code>  of the
  +          context node has a Container as its value, the XPath "foo"
  +          will produce the contents of that Container, not the
  +          container itself.
  +        </p>
  +        <p>
  +          An example of a useful container is
  +          <a href="api/org/apache/commons/jxpath/XMLDocumentContainer.html">XMLDocumentContainer</a>.
  +          When you create an XMLDocumentContainer, you give it a
  +          pointer to an XML file (a <code>URL</code>  or a
  +          <code>javax.xml.transform.Source</code>. It will read
  +          and parse the XML file only when it is accessed. You can
  +          create XMLDocumentContainers for various XML documents that
  +          may or may not be accessed by XPaths. If they are, they
  +          will be automatically read, parsed and traversed. If they
  +          are not- they won't be read at all.
  +        </p>
  +        <p>
  +          Let's say we have the the following XML file, which is
  +          stored as a Java resource.
  +        </p>
  +
  +<!--============================ + SOURCE + ============================-->
   <source>
  -                                                                       <b></b>
  +                                                                       <b/>
       &lt;?xml version="1.0" ?&gt;
       &lt;vendor&gt;
         &lt;location id="store101"&gt;
  @@ -345,11 +428,15 @@
         &lt;/location&gt;
       &lt;/vendor&gt;
   </source>
  -<p>
  -Here's the code that makes use of XMLDocumentContainer.
  -</p>
  +<!--============================ - SOURCE - ============================-->
  +
  +        <p>
  +          Here's the code that makes use of XMLDocumentContainer.
  +        </p>
  +
  +<!--============================ + SOURCE + ============================-->
   <source>
  -                                                                       <b></b>
  +                                                                       <b/>
    class Company {
       private Container locations = null;
   
  @@ -367,33 +454,68 @@
    String street = (String)context.getValue(
                   "locations/vendor/location[@id = 'store102']//street");
   </source>
  -<p>
  -Like was described before, this code will implicitly open and parse the XML
  -file and find a value in it according to the XPath.
  -</p>
  -</subsection>
  -
  -<p><b>Note:</b>
  -     JXPath does not support DOM attributes for non-DOM objects. Even though XPaths
  -     like <code>"para[@type='warning']"</code> are legitimate, they will always produce empty results.
  -     The only attributes supported for JavaBeans are <code>"name"</code> and <code>"xml:lang"</code>.
  -</p>
  -
  -</section>
  -
  -<section name="Modifying Object Graphs">
  -<p>
  -JXPath can also be used to modify parts of object graphs: property values,
  -values for keys in Maps.  It can in some cases create intermediate
  -nodes in object graphs.
  -</p>
  -
  -<subsection name="Setting Properties">
  - <p>
  - JXPath can be used to modify property values.
  - </p>
  - <source>
  -                                                                       <b></b>
  +<!--============================ - SOURCE - ============================-->
  +
  +        <p>
  +          Like was described before, this code will implicitly open
  +          and parse the XML file and find a value in it according to
  +          the XPath.
  +        </p>
  +      </subsection>
  +
  +      <subsection name="Functions id() and key()">
  +        <p>
  +          Functions <code>id()</code> and <code>key()</code> can be
  +          used with JXPath, however most of the time it requires custom
  +          coding.
  +        </p>
  +        <p>
  +          The only situation where no custom coding is needed is when
  +          you want to use the <code>id()</code> function and you have
  +          a DOM Node as the context node of the JXPathContext. In
  +          this case, JXPath will use the standard behavior of DOM.
  +        </p>
  +        <p>
  +          In order to evaluate the <code>id()</code> function, JXPath
  +          calls a delegate object that should be implemented and installed
  +          on the JXPathContext.  The object should implement the
  +          <a href="api/org/apache/commons/jxpath/IdentityManager.html">IdentityManager</a>
  +          interface.
  +        </p>
  +        <p>
  +          Similarly, the <code>key()</code> function relies on a custom
  +          implementation of the
  +          <a href="api/org/apache/commons/jxpath/KeyManager.html">KeyManager</a>
  +          interface.
  +        </p>
  +      </subsection>
  +
  +      <p><b>Note:</b>  JXPath does not support DOM attributes for non-DOM
  +        objects. Even though XPaths like
  +        <code>"para[@type='warning']"</code>  are legitimate, they
  +        will always produce empty results. The only attributes
  +        supported for JavaBeans are <code>"name"</code>  and
  +        <code>"xml:lang"</code>.
  +      </p>
  +    </section>
  +
  +
  +    <section name="Modifying Object Graphs">
  +      <p>
  +        JXPath can also be used to modify parts of object graphs:
  +        property values, values for keys in Maps. It can in some cases
  +        create intermediate nodes in object graphs.
  +      </p>
  +
  +
  +      <subsection name="Setting Properties">
  +        <p>
  +          JXPath can be used to modify property values.
  +        </p>
  +
  +<!--============================ + SOURCE + ============================-->
  +<source>
  +                                                                       <b/>
    public class Employee {
       public Address getAddress() {
          ...
  @@ -412,20 +534,26 @@
    context.setValue("address", addr);
    context.setValue("address/zipCode", "90190");
    </source>
  -</subsection>
  +<!--============================ - SOURCE - ============================-->
   
  -<subsection name="Creating Objects">
  -<p>
  - JXPath can be used to create new objects. First, create a subclass of
  - <a href="api/org/apache/commons/jxpath/AbstractFactory.html"><code>AbstractFactory</code></a>
  - and install it on the JXPathContext.
  - Then call <code>jxPathContext.createPath(xpath, value)</code> instead of "setValue".
  - JXPathContext will invoke your AbstractFactory when it discovers that an
  - intermediate node of the path is <b>null</b>.  It will not override existing
  - nodes.
  -</p>
  - <source>
  -                                                                       <b></b>
  +      </subsection>
  +
  +
  +      <subsection name="Creating Objects">
  +        <p>
  +          JXPath can be used to create new objects. First, create a
  +          subclass of
  +          <a href="api/org/apache/commons/jxpath/AbstractFactory.html"><code>AbstractFactory</code></a>
  +          and install it on the JXPathContext. Then call
  +          <code>jxPathContext.createPath(xpath)</code>.
  +          JXPathContext will invoke your AbstractFactory when it
  +          discovers that an intermediate node of the path is <b>null</b>.
  +          It will not override existing nodes.
  +        </p>
  +
  +<!--============================ + SOURCE + ============================-->
  +<source>
  +                                                                       <b/>
    public class AddressFactory extends AbstractFactory {
       public boolean createObject(JXPathContext context, Pointer pointer,
                                   Object parent, String name, int index){
  @@ -439,33 +567,58 @@
   
    JXPathContext context = JXPathContext.newContext(emp);
    context.setFactory(new AddressFactory());
  - context.createPath("address/zipCode", "90190");
  + context.createPath("address");
  +</source>
  +<!--============================ - SOURCE - ============================-->
  +
  +        <p>
  +          You can also combine creating a path with setting the value
  +          of the leaf: the <code>createPathAndSetValue(path, value)</code>
  +          method is used for that.
  +        </p>
  +
  +<!--============================ + SOURCE + ============================-->
  +<source>
  +                                                                       <b/>
  + context.createPathAndSetValue("address/zipCode", "90190");
   </source>
  +<!--============================ - SOURCE - ============================-->
  +
  +        <p>
  +          Note that it only makes sense to the automatic creation of
  +          nodes with very simple paths. In fact, JXPath will not
  +          attempt to create intermediate nodes for paths that don't
  +          follow these rules:
  +          <ul>
  +            <li>
  +              The only axis used is "child::", e.g.
  +              <code>"foo/bar/baz"</code>
  +            </li>
  +            <li>
  +              The only two types of predicates used are
  +              context-independent indexing and the
  +              <code>"[@name = <i>expr</i>]"</code>
  +              construct, e.g. <code>"map[@name='key1'][4/2]"</code>.
  +            </li>
  +            <li>
  +              If a variable is used, it is the root of the path,
  +              e.g. <code>"$object/child"</code>.
  +            </li>
  +          </ul>
  +        </p>
  +      </subsection>
  +    </section>
  +
   
  -<p>
  - Note that it only makes sense to use this functionality with very simple
  - paths. In fact, JXPath will not attempt to create intermediate nodes
  - for paths that don't follow these two rules:
  - <ul>
  -   <li>The only axis used is "child::", e.g. <code>"foo/bar/baz"</code></li>
  -   <li>The only two types of predicates used are context-independent
  -     indexing and the <code>"[@name = <i>expr</i>]"</code> construct, e.g.
  -     <code>"map[@name='key1'][4/2]"</code>.</li>
  -   <li>If a variable is used, it is the root of the path, e.g.
  -     <code>"$object/child"</code>.</li>
  - </ul>
  -</p>
  -</subsection>
  -</section>
  -
  -<section name="Variables">
  - <p>
  - JXPath supports the notion of variables. The XPath syntax for accessing
  - variables is <i>"$varName"</i>.
  - </p>
  +    <section name="Variables">
  +      <p>
  +        JXPath supports the notion of variables. The XPath syntax for
  +        accessing variables is <i>"$varName"</i>.
  +      </p>
   
  - <source>
  -                                                                       <b></b>
  +<!--============================ + SOURCE + ============================-->
  +<source>
  +                                                                       <b/>
    public class Author {
       public Book[] getBooks(){
          ...
  @@ -480,30 +633,36 @@
   
    Book secondBook = (Book)context.getValue("books[$index]");
    </source>
  +<!--============================ - SOURCE - ============================-->
   
  - <p>
  - You can also set variables using JXPath:
  - </p>
  +      <p>
  +        You can also set variables using JXPath:
  +      </p>
   
  - <source>
  -                                                                       <b></b>
  +<!--============================ + SOURCE + ============================-->
  +<source>
  +                                                                       <b/>
    context.setValue("$index", new Integer(3));
    </source>
  +<!--============================ - SOURCE - ============================-->
   
  - <p>
  - <b>Note:</b> generally speaking, you can only <i>change</i> the value of an existing variable this
  - way, you cannot <i>define</i> a new variable.  If you do want to define a new variable dynamically,
  - implement a <code>defineVariable()</code> method on your custom AbstractFactory and call
  - <code>createPath()</code> rather than <code>setValue()</code>.  The restrictions described in
  - the "Creating Objects" section still apply.
  - </p>
  - <p>
  - When a variable contains a JavaBean or a collection, you can
  - traverse the bean or collection as well:
  - </p>
  +      <p><b>Note:</b>  generally speaking, you can only <i>change</i>  the
  +        value of an existing variable this way, you cannot <i>define</i>
  +        a new variable. If you do want to define a new variable
  +        dynamically, implement a <code>defineVariable()</code>
  +        method on your custom AbstractFactory and call
  +        <code>createPathAndSetValue()</code>  rather than
  +        <code>setValue()</code>. The restrictions described in the
  +        "Creating Objects" section still apply.
  +      </p>
  +      <p>
  +        When a variable contains a JavaBean or a collection, you can
  +        traverse the bean or collection as well:
  +      </p>
   
  - <source>
  -                                                                       <b></b>
  +<!--============================ + SOURCE + ============================-->
  +<source>
  +                                                                       <b/>
    ...
    context.getVariables().declareVariable("book", myBook);
    String title = (String)context.getValue("$book/title);
  @@ -514,182 +673,233 @@
   
    String title = (String)context.getValue("$books[2]/title);
    </source>
  -<p>
  +<!--============================ - SOURCE - ============================-->
  +
  +      <p/>
   
  -</p>
   
  - <subsection name="Custom Variable Pools">
  - <p>
  - By default, JXPathContext creates a HashMap of variables. However,
  - you can substitute a custom implementation of the Variables
  - interface to make JXPath work with an alternative source of variables.
  - For example, you can define implementations of Variables that
  - cover a servlet context, HTTP request or any similar structure.
  - </p>
  - <p>See the
  - <a href="api/org/apache/commons/jxpath/servlet/package-summary.html">org.apache.commons.jxpath.servlet</a>
  - package for an example of just that.
  - </p>
  - </subsection>
  -</section>
  -
  -<section name="Servlet Contexts">
  -    <p>
  -    The <code>org.apache.commons.jxpath.servlet</code> package contains
  -    classes that make it easy to use XPath to access values in various sevlet contexts:
  -    "page" (for JSPs), "request", "session" and "application".
  -    </p>
  -    <p>
  -    See static methods of the class
  -    <a href="api/org/apache/commons/jxpath/servlet/JXPathServletContexts.html"><code>JXPathServletContexts</code></a>.
  -    They allocate various servlet-related JXPathContexts.
  -    </p>
  -
  -    <subsection name="JSP Page Context">
  -        <p>
  -        The JXPathContext returned by <code>getPageContext(PageContext pageContext)</code>
  -        provides access to all scopes via the <code>PageContext.findAttribute()</code>
  -        method.  Thus, an expression like <code>"foo"</code> will first look for the attribute
  -        named <code>"foo"</code> in the <code>"page"</code> context, then the <code>"request"</code> context, then
  -        the <code>"session"</code> one and finally in the <code>"application"</code> context.
  -        </p>
  -        <p>
  -        If you need to limit the attibute lookup to just one scope, you can use the
  -        pre-definded variables <code>"page"</code>, <code>"request"</code>,
  -        <code>"session"</code> and <code>"application"</code>.
  -        For example, the expression <code>"$session/foo"</code> extracts the value of the
  -        <i>session</i> attribute named <code>"foo"</code>.
  -        </p>
  -    </subsection>
  -
  -    <subsection name="Servlet Request Context">
  -        <p>
  -        The <code>getRequestContext(ServletRequest request, ServletContext servletContext)</code>
  -        method will give you a context that checks the request scope first, then (if there is
  -        a session) the session context, then the application context.
  -        </p>
  -    </subsection>
  -
  -    <subsection name="HttpSession Context">
  -        <p>
  -        The <code>getSessionContext(HttpSession session, ServletContext servletContext)</code>
  -        method will give you a context that checks the session context, then the application context.
  -        </p>
  -    </subsection>
  -
  -    <subsection name="ServletContext Context">
  -        <p>
  -        Finally, <code>getApplicationContext(ServletContext servletContext)</code>
  -        method will give you a context that checks the application context.
  -        </p>
  -    </subsection>
  -
  -    <p>
  -    All these methods cache the JXPathContexts they create within the corresponding
  -    scopes. Subsequent calls use the JXPathContexts created earlier.
  -    </p>
  -</section>
  -
  -<section name="Pointers">
  -<p>
  -JXPath supports so called Pointers. A Pointer is an
  -object that represents a location of a node in an object graph.
  -For example, you can call
  -</p>
  +      <subsection name="Custom Variable Pools">
  +        <p>
  +          By default, JXPathContext creates a HashMap of variables.
  +          However, you can substitute a custom implementation of the
  +          Variables interface to make JXPath work with an alternative
  +          source of variables. For example, you can define
  +          implementations of Variables that cover a servlet context,
  +          HTTP request or any similar structure.
  +        </p>
  +        <p>
  +          See the
  +          <a href="api/org/apache/commons/jxpath/servlet/package-summary.html">org.apache.commons.jxpath.servlet</a>
  +          package for an example of just that.
  +        </p>
  +      </subsection>
  +    </section>
  +
  +    <section name="Servlet Contexts">
  +      <p>
  +        The <code>org.apache.commons.jxpath.servlet</code>  package
  +        contains classes that make it easy to use XPath to access
  +        values in various sevlet contexts: "page" (for JSPs),
  +        "request", "session" and "application".
  +      </p>
  +      <p>
  +        See static methods of the class
  +        <a href="api/org/apache/commons/jxpath/servlet/JXPathServletContexts.html"><code>JXPathServletContexts</code></a>.
  +        They allocate various servlet-related JXPathContexts.
  +      </p>
  +
  +
  +      <subsection name="JSP Page Context">
  +        <p>
  +          The JXPathContext returned by
  +          <code>getPageContext(PageContext pageContext)</code>
  +          provides access to all scopes via the
  +          <code>PageContext.findAttribute()</code>  method. Thus,
  +          an expression like <code>"foo"</code>  will first look
  +          for the attribute named <code>"foo"</code>  in the
  +          <code>"page"</code>  context, then the <code>"request"</code>
  +          context, then the <code>"session"</code>  one and
  +          finally in the <code>"application"</code>  context.
  +        </p>
  +        <p>
  +          If you need to limit the attibute lookup to just one scope,
  +          you can use the pre-definded variables <code>"page"</code>,
  +          <code>"request"</code>, <code>"session"</code>  and
  +          <code>"application"</code>. For example, the
  +          expression <code>"$session/foo"</code>  extracts the
  +          value of the <i>session</i>  attribute named <code>"foo"</code>.
  +        </p>
  +      </subsection>
  +
  +
  +      <subsection name="Servlet Request Context">
  +        <p>
  +          The
  +          <code>getRequestContext(ServletRequest request, ServletContext servletContext)</code>
  +          method will give you a context that checks the request
  +          scope first, then (if there is a session) the session
  +          context, then the application context.
  +        </p>
  +      </subsection>
  +
  +
  +      <subsection name="HttpSession Context">
  +        <p>
  +          The
  +          <code>getSessionContext(HttpSession session, ServletContext servletContext)</code>
  +          method will give you a context that checks the session
  +          context, then the application context.
  +        </p>
  +      </subsection>
  +
  +
  +      <subsection name="ServletContext Context">
  +        <p>
  +          Finally,
  +          <code>getApplicationContext(ServletContext servletContext)</code>
  +          method will give you a context that checks the application
  +          context.
  +        </p>
  +      </subsection>
  +      <p>
  +        All these methods cache the JXPathContexts they create within
  +        the corresponding scopes. Subsequent calls use the
  +        JXPathContexts created earlier.
  +      </p>
  +    </section>
  +
  +
  +    <section name="Pointers">
  +      <p>
  +        JXPath supports so called Pointers. A Pointer is an object that
  +        represents a location of a node in an object graph. For
  +        example, you can call
  +      </p>
  +
  +<!--============================ + SOURCE + ============================-->
   <source>
  -                                                                       <b></b>
  +                                                                       <b/>
   Pointer ptr = context.getPointer("employees[$i]/addresses[$j]")
   </source>
  -<p>
  -Let's say the value of the variable i is 1 and j = 3.
  -If we call <code>ptr.asPath()</code>,
  -it returns an XPath that describes this concrete
  -location: <code>"/employees[1]/addresses[3]"</code>.
  -</p>
  -<p>
  -If you have an XPath that finds many nodes in the graph, you can
  -get JXPath to produce a collection of pointers for all of those
  -found locations:
  -</p>
  -<source>
  -                                                                       <b></b>
  -List homeAddresses = context.locate("//employee/address[@name='home']");
  -</source>
  -<p>
  -Each Pointer in the list will map to a home address object in the graph.
  -</p>
  -<p>
  -It is a good idea to use pointers whenever you need
  -to access the same node of a graph repeatedly.
  -</p>
  -<p>
  -Also, when an XPath is repeatedly evaluated in different contexts (for example,
  -with different variable values) and you need to preseve results of those
  -evaluations.  A Pointer, as well as the XPath produced by <code>pointer.asPath()</code>
  -is context-independent, it won't change if involved variables or expressions change.
  -</p>
  -<p>
  -JXPath is optimized to interpret XPaths produced by Pointers much faster
  -than many other types of XPaths.
  -</p>
  -</section>
  -
  -<section name="Extension Functions">
  -<p>
  - JXPath supports standard XPath functions right out of the box.
  - It also supports "standard" extension functions, which are basically a bridge
  - to Java as well as entirely custom extension functions.
  -</p>
  -
  -<subsection name="Standard Extension Functions">
  -<p>
  - Using the standard extension functions, you can call methods on objects,
  - static methods on classes and create objects using any constructors.
  - All class names should be fully qualified.
  -</p>
  -<p>
  - Here's how you can create new objects:
  -</p>
  +<!--============================ - SOURCE - ============================-->
  +
  +      <p>
  +        Let's say the value of the variable i is 1 and j = 3. If we
  +        call <code>ptr.asPath()</code>, it returns an XPath that
  +        describes this concrete location:
  +        <code>"/employees[1]/addresses[3]"</code>.
  +      </p>
  +      <p>
  +        If you have an XPath that finds many nodes in the graph, you
  +        can get JXPath to produce a collection of pointers for all of
  +        those found locations:
  +      </p>
  +
  +<!--============================ + SOURCE + ============================-->
  +<source>
  +                                                                       <b/>
  +List homeAddresses = context.getPointer("//employee/address[@name='home']");
  +</source>
  +<!--============================ - SOURCE - ============================-->
  +
  +      <p>
  +        Each Pointer in the list will map to a home address object in
  +        the graph.
  +      </p>
  +      <p>
  +        It is a good idea to use pointers whenever you need to access
  +        the same node of a graph repeatedly.
  +      </p>
  +      <p>
  +        Also, when an XPath is repeatedly evaluated in different
  +        contexts (for example, with different variable values) and you
  +        need to preseve results of those evaluations. A Pointer, as
  +        well as the XPath produced by <code>pointer.asPath()</code>
  +        is context-independent, it won't change if involved variables
  +        or expressions change.
  +      </p>
  +      <p>
  +        JXPath is optimized to interpret XPaths produced by Pointers
  +        much faster than many other types of XPaths.
  +      </p>
  +    </section>
  +
  +
  +    <section name="Extension Functions">
  +      <p>
  +        JXPath supports standard XPath functions right out of the box.
  +        It also supports "standard" extension functions, which are
  +        basically a bridge to Java as well as entirely custom extension
  +        functions.
  +      </p>
  +
  +
  +      <subsection name="Standard Extension Functions">
  +        <p>
  +          Using the standard extension functions, you can call
  +          methods on objects, static methods on classes and create
  +          objects using any constructors. All class names should be
  +          fully qualified.
  +        </p>
  +        <p>
  +          Here's how you can create new objects:
  +        </p>
  +
  +<!--============================ + SOURCE + ============================-->
   <source>
  -                                                                       <b></b>
  +                                                                       <b/>
    Book book = (Book)context.
      getValue("com.myco.books.Book.new('John Updike')");
   </source>
  +<!--============================ - SOURCE - ============================-->
  +
  +        <p>
  +          Here's how you can call static methods:
  +        </p>
   
  -<p>
  - Here's how you can call static methods:
  -</p>
  +<!--============================ + SOURCE + ============================-->
   <source>
  -                                                                       <b></b>
  +                                                                       <b/>
    Book book = (Book)context.
      getValue("com.myco.books.Book.getBestBook('John Updike')");
   </source>
  +<!--============================ - SOURCE - ============================-->
   
  -<p>
  - Here's how you can call regular methods:
  -</p>
  - <source>
  -                                                                       <b></b>
  +        <p>
  +          Here's how you can call regular methods:
  +        </p>
  +
  +<!--============================ + SOURCE + ============================-->
  +<source>
  +                                                                       <b/>
    String firstName = (String)context.
      getValue("getAuthorsFirstName($book)");
    </source>
  -<p>
  - As you can see, the target of the method is specified as the first parameter
  - of the function.
  -</p>
  -</subsection>
  -
  -<subsection name="Custom Extension Functions">
  -<p>
  - Collections of custom extension functions can be implemented
  - as <a href="api/org/apache/commons/jxpath/Functions.html"><code>Functions</code></a>
  - objects or as Java classes, whose methods become extenstion functions.
  -</p>
  -<p>
  - Let's say the following class implements various formatting operations:
  -</p>
  +<!--============================ - SOURCE - ============================-->
  +
  +        <p>
  +          As you can see, the target of the method is specified as
  +          the first parameter of the function.
  +        </p>
  +      </subsection>
  +
  +
  +      <subsection name="Custom Extension Functions">
  +        <p>
  +          Collections of custom extension functions can be
  +          implemented as
  +          <a href="api/org/apache/commons/jxpath/Functions.html"><code>Functions</code></a>
  +          objects or as Java classes, whose methods become extenstion
  +          functions.
  +        </p>
  +        <p>
  +          Let's say the following class implements various formatting
  +          operations:
  +        </p>
  +
  +<!--============================ + SOURCE + ============================-->
   <source>
  -                                                                       <b></b>
  +                                                                       <b/>
    public class Formats {
       public static String date(Date d, String pattern){
           return new SimpleDateFormat(pattern).format(d);
  @@ -697,12 +907,15 @@
       ...
    }
   </source>
  +<!--============================ - SOURCE - ============================-->
  +
  +        <p>
  +          We can register this class with a JXPathContext:
  +        </p>
   
  -<p>
  - We can register this class with a JXPathContext:
  -</p>
  +<!--============================ + SOURCE + ============================-->
   <source>
  -                                                                       <b></b>
  +                                                                       <b/>
    context.setFunctions(new ClassFunctions(Formats.class, "format"));
    ...
   
  @@ -710,28 +923,37 @@
    String today =
        (String)context.getValue("format:date($today, 'MM/dd/yyyy')");
   </source>
  -<p>
  - You can also register whole packages of Java classes using PackageFunctions.
  -</p>
  -<p>
  - Also, see <a href="api/org/apache/commons/jxpath/FunctionLibrary.html"><code>FunctionLibrary</code></a>,
  - which is a class that allows you to register multiple sets of extension functions with
  - the same JXPathContext.
  -</p>
  -</subsection>
  -
  -<subsection name="Expression Context">
  -<p>
  -  A custom function can get access to the context in which it is being
  -  evaluated.  ClassFunctions and PackageFunctions have special support for
  -  methods and constructors that have <a href="api/org/apache/commons/jxpath/ExpressionContext.html">
  -  <code>ExpressionContext</code></a> as the first argument.
  -  When such extension function is invoked, it is given an object
  -  that implements the ExpressionContext interface.  The function can then
  -  gain access to the "current" object in the currently evaluated context.
  -</p>
  +<!--============================ - SOURCE - ============================-->
  +
  +        <p>
  +          You can also register whole packages of Java classes using
  +          PackageFunctions.
  +        </p>
  +        <p>
  +          Also, see
  +          <a href="api/org/apache/commons/jxpath/FunctionLibrary.html"><code>FunctionLibrary</code></a>,
  +          which is a class that allows you to register multiple sets
  +          of extension functions with the same JXPathContext.
  +        </p>
  +      </subsection>
  +
  +
  +      <subsection name="Expression Context">
  +        <p>
  +          A custom function can get access to the context in which it
  +          is being evaluated. ClassFunctions and PackageFunctions
  +          have special support for methods and constructors that have
  +          <a href="api/org/apache/commons/jxpath/ExpressionContext.html"><code>ExpressionContext</code></a>
  +          as the first argument. When such extension function is
  +          invoked, it is given an object that implements the
  +          ExpressionContext interface. The function can then gain
  +          access to the "current" object in the currently evaluated
  +          context.
  +        </p>
  +
  +<!--============================ + SOURCE + ============================-->
   <source>
  -                                                                       <b></b>
  +                                                                       <b/>
   public class MyExtenstionFunctions {
      public static boolean isDate(ExpressionContext context){
         Pointer pointer = context.getContextNodePointer();
  @@ -743,28 +965,37 @@
      ...
   }
   </source>
  +<!--============================ - SOURCE - ============================-->
   
  -<p>
  -You can then register this extension function using ClassFunctions and
  -call it like this:
  -</p>
  +        <p>
  +          You can then register this extension function using
  +          ClassFunctions and call it like this:
  +        </p>
  +
  +<!--============================ + SOURCE + ============================-->
   <source>
  -                                                                       <b></b>
  +                                                                       <b/>
     "//.[myext:isDate()]"
   </source>
  -<p>
  -This expression will find all nodes of the graph that are dates.
  -</p>
  -<p>
  -The current context is passed to an extension function by default. Any other
  -context can be passed as an explicit argument declared as ExpressionContext.
  -Note, that if the first argument is ExpressionContext, it is always passed the
  -current context. Therefore, you may need to declare two ExpressionContext
  -arguments - one for the current and one for the parameter context.
  -For example,
  -</p>
  +<!--============================ - SOURCE - ============================-->
  +
  +        <p>
  +          This expression will find all nodes of the graph that are
  +          dates.
  +        </p>
  +        <p>
  +          The current context is passed to an extension function by
  +          default. Any other context can be passed as an explicit
  +          argument declared as ExpressionContext. Note, that if the
  +          first argument is ExpressionContext, it is always passed
  +          the current context. Therefore, you may need to declare two
  +          ExpressionContext arguments- one for the current and one
  +          for the parameter context. For example,
  +        </p>
  +
  +<!--============================ + SOURCE + ============================-->
   <source>
  -                                                                       <b></b>
  +                                                                       <b/>
   public class MyExtenstionFunctions {
      ...
      public static boolean contains(ExpressionContext current,
  @@ -780,102 +1011,246 @@
      }
   }
   </source>
  -<p>
  -You can call this function to find all people who have a certain phone number:
  -</p>
  +<!--============================ - SOURCE - ============================-->
  +
  +        <p>
  +          You can call this function to find all people who have a
  +          certain phone number:
  +        </p>
  +
  +<!--============================ + SOURCE + ============================-->
   <source>
  -                                                                       <b></b>
  +                                                                       <b/>
     "/addressBook/contact[myext:contains(phoneNumbers, '555-5555']"
   </source>
  +<!--============================ - SOURCE - ============================-->
  +
  +      </subsection>
  +    </section>
   
  -</subsection>
  -</section>
   
  -<section name="Type Conversions">
  -<p>
  - JXPath automatically performs the following type convertions:
  -</p>
  -
  -<table>
  -  <tr>
  -    <th>From type</th>
  -    <th>To type</th>
  -    <th>Operation</th>
  -  </tr>
  -  <tr><td><i>any</i></td><td>String</td>
  -        <td>Calls toString()</td></tr>
  -  <tr><td>Boolean</td><td><i>any</i> Number</td>
  -        <td>True = 1, false = 0</td></tr>
  -  <tr><td><i>any</i> Number</td><td><i>any other</i> Number</td>
  -        <td>Truncates if needed</td></tr>
  -  <tr><td>String</td><td><i>any primitive type</i></td>
  -        <td>Parses the string</td></tr>
  -  <tr><td><i>array of length 1</i></td><td><i>any</i></td>
  -        <td>Takes the single element of the array <br/>and (recursively) converts it to the needed type</td></tr>
  -  <tr><td><i>collection of size 1</i></td><td><i>any</i></td>
  -        <td>Takes the single element of the array <br/>and (recursively) converts it to the needed type</td></tr>
  -  <tr><td><i>array</i></td><td><i>array</i></td>
  -        <td>Creates a new array of the same size and converts every element</td></tr>
  -  <tr><td><i>array</i></td><td><i>Collection</i></td>
  -        <td>Creates a collection and adds to it all elements of the array. Note that it will only 
  -            know how to create the collection if the type is a concrete class, List or Set</td></tr>
  -  <tr><td><i>Collection</i></td><td><i>array</i></td>
  -        <td>Creates a new array the same size as the collection, converts and copies every element
  -            of the collection into the array.</td></tr>
  -  <tr><td><i>Collection</i></td><td><i>Collection</i></td>
  -        <td>Creates a collection and copies the source collection into the new collection. Note that it will only 
  -            know how to create the collection if the type is a concrete class, List or Set</td></tr>
  -  <tr><td>ExpressionContext</td><td>Collection, List, Vector, Set</td>
  -        <td>Creates a collection of type ArrayList, <br/>
  -            ArrayList, Vector, HashSet respectively and <br/>
  -            populates it with all current context node pointers</td></tr>
  -  <tr><td>ExpressionContext</td><td><i>any</i></td>
  -        <td>Obtains value of the current context node pointer <br/>and (recursively) converts it to the needed type</td></tr>
  -</table>
  -</section>
  -
  -<section name="Internationalization">
  -<p>
  -For DOM Documents JXPathContext supports internationalization XPath-style.
  -A locale can be declared on an XML Element like this:
  -</p>
  +    <section name="Type Conversions">
  +      <p>
  +        JXPath automatically performs the following type convertions:
  +      </p>
  +      <table>
  +        <tr>
  +          <th>
  +            From type
  +          </th>
  +          <th>
  +            To type
  +          </th>
  +          <th>
  +            Operation
  +          </th>
  +        </tr>
  +        <tr>
  +          <td><i>null</i>
  +          </td>
  +          <td><i>primitive</i>
  +          </td>
  +          <td>
  +            false, zero
  +          </td>
  +        </tr>
  +        <tr>
  +          <td><i>any</i>
  +          </td>
  +          <td>
  +            String
  +          </td>
  +          <td>
  +            Calls toString()
  +          </td>
  +        </tr>
  +        <tr>
  +          <td>
  +            Boolean
  +          </td>
  +          <td><i>any</i>  Number
  +          </td>
  +          <td>
  +            True = 1, false = 0
  +          </td>
  +        </tr>
  +        <tr>
  +          <td><i>any</i>  Number
  +          </td>
  +          <td><i>any other</i>  Number
  +          </td>
  +          <td>
  +            Truncates if needed
  +          </td>
  +        </tr>
  +        <tr>
  +          <td>
  +            String
  +          </td>
  +          <td><i>any primitive type</i>
  +          </td>
  +          <td>
  +            Parses the string
  +          </td>
  +        </tr>
  +        <tr>
  +          <td><i>array of length 1</i>
  +          </td>
  +          <td><i>any</i>
  +          </td>
  +          <td>
  +            Takes the single element of the array
  +            <br/>
  +             and (recursively) converts it to the needed
  +            type
  +          </td>
  +        </tr>
  +        <tr>
  +          <td><i>collection of size 1</i>
  +          </td>
  +          <td><i>any</i>
  +          </td>
  +          <td>
  +            Takes the single element of the array
  +            <br/>
  +             and (recursively) converts it to the needed
  +            type
  +          </td>
  +        </tr>
  +        <tr>
  +          <td><i>array</i>
  +          </td>
  +          <td><i>array</i>
  +          </td>
  +          <td>
  +            Creates a new array of the same size and converts every
  +            element
  +          </td>
  +        </tr>
  +        <tr>
  +          <td><i>array</i>
  +          </td>
  +          <td><i>Collection</i>
  +          </td>
  +          <td>
  +            Creates a collection and adds to it all elements of the
  +            array. Note that it will only know how to create the
  +            collection if the type is a concrete class, List or Set
  +          </td>
  +        </tr>
  +        <tr>
  +          <td><i>Collection</i>
  +          </td>
  +          <td><i>array</i>
  +          </td>
  +          <td>
  +            Creates a new array the same size as the collection,
  +            converts and copies every element of the collection
  +            into the array.
  +          </td>
  +        </tr>
  +        <tr>
  +          <td><i>Collection</i>
  +          </td>
  +          <td><i>Collection</i>
  +          </td>
  +          <td>
  +            Creates a collection and copies the source collection
  +            into the new collection. Note that it will only know
  +            how to create the collection if the type is a concrete
  +            class, List or Set
  +          </td>
  +        </tr>
  +        <tr>
  +          <td>
  +            ExpressionContext
  +          </td>
  +          <td>
  +            Collection, List, Vector, Set
  +          </td>
  +          <td>
  +            Creates a collection of type ArrayList,
  +            <br/>
  +             ArrayList, Vector, HashSet respectively and
  +            <br/>
  +             populates it with all current context node
  +            pointers
  +          </td>
  +        </tr>
  +        <tr>
  +          <td>
  +            ExpressionContext
  +          </td>
  +          <td><i>any</i>
  +          </td>
  +          <td>
  +            Obtains value of the current context node pointer
  +            <br/>
  +             and (recursively) converts it to the needed
  +            type
  +          </td>
  +        </tr>
  +      </table>
  +    </section>
  +
  +
  +    <section name="Internationalization">
  +      <p>
  +        For DOM Documents JXPathContext supports internationalization
  +        XPath-style. A locale can be declared on an XML Element like
  +        this:
  +      </p>
  +
  +<!--============================ + SOURCE + ============================-->
   <source>
  -                                                                       <b></b>
  +                                                                       <b/>
        &lt;book xml:lang="fr"&gt;Les Miserables&lt;/book&gt;
   </source>
  -<p>
  -You can then use the <code>lang</code> function in XPath to find nodes
  -for a specific language:
  -</p>
  +<!--============================ - SOURCE - ============================-->
  +
  +      <p>
  +        You can then use the <code>lang</code>  function in XPath
  +        to find nodes for a specific language:
  +      </p>
  +
  +<!--============================ + SOURCE + ============================-->
   <source>
  -                                                                       <b></b>
  +                                                                       <b/>
        "//book[lang('fr')]
   </source>
  -<p>
  -The <code>"lang"</code> boolean function is supported for non-DOM objects as well.  It tests
  -the Locale set on the JXPathContext (or the default locale).  See
  -<a href="api/org/apache/commons/jxpath/JXPathContext.html#setLocale">JXPathContext.setLocale()</a>.
  -</p>
  -<p>
  - You can also utilize the <code>xml:lang</code> attribute, whose value is
  - the name of the locale, whether in a DOM document or outside.
  -</p>
  -</section>
  -
  -<section name="Nested Contexts">
  - <p>
  - If you need to use the same set of variables while interpreting
  - XPaths with different beans, it makes sense to put the variables in a separate
  - context and specify that context as a parent context every time you
  - allocate a new JXPathContext for a JavaBean.  This way you don't need
  - to waste time fully configuring every context.
  - </p>
  - <p>The same logic
  - applies to shared extension functions, abstract factories and locale.
  - </p>
  +<!--============================ - SOURCE - ============================-->
  +
  +      <p>
  +        The <code>"lang"</code>  boolean function is supported for
  +        non-DOM objects as well. It tests the Locale set on the
  +        JXPathContext (or the default locale). See
  +        <a href="api/org/apache/commons/jxpath/JXPathContext.html#setLocale">JXPathContext.setLocale()</a>.
  +      </p>
  +      <p>
  +        You can also utilize the <code>xml:lang</code>  attribute,
  +        whose value is the name of the locale, whether in a DOM
  +        document or outside.
  +      </p>
  +    </section>
  +
  +
  +    <section name="Nested Contexts">
  +      <p>
  +        If you need to use the same set of variables while interpreting
  +        XPaths with different beans, it makes sense to put the
  +        variables in a separate context and specify that context as a
  +        parent context every time you allocate a new JXPathContext for
  +        a JavaBean. This way you don't need to waste time fully
  +        configuring every context.
  +      </p>
  +      <p>
  +        The same logic applies to shared extension functions, abstract
  +        factories and locale.
  +      </p>
   
  +<!--============================ + SOURCE + ============================-->
   <source>
  -                                                                       <b></b>
  +                                                                       <b/>
    JXPathContext sharedContext = JXPathContext.newContext(null);
    sharedContext.getVariables().declareVariable("title", "Java");
    sharedContext.setFunctions(new MyExtensionFunctions());
  @@ -886,136 +1261,175 @@
   
    JXPathContext context = JXPathContext.newContext(sharedContext, auth);
   
  - Iterator javaBooks = 
  + Iterator javaBooks =
         context.iterate("books[preprocessTitle(title) = $title]");
    </source>
  -</section>
  +<!--============================ - SOURCE - ============================-->
   
  +    </section>
   
  -<section name="Compiled Expressions">
  -<p>
  -When JXPath is asked to evaluate an expression for the first time,
  -it compiles it and caches its compiled representation.  This mechanism
  -reduces the overhead caused by compilation.  In some cases though,
  -JXPath's own caching may not be sufficient - JXPath caches have
  -limited size and they are cleared once in a while. 
  -</p>
  -<p>
  -Here's how you can precompile an XPath expression:
  -</p>
  +
  +    <section name="Compiled Expressions">
  +      <p>
  +        When JXPath is asked to evaluate an expression for the first
  +        time, it compiles it and caches its compiled representation.
  +        This mechanism reduces the overhead caused by compilation. In
  +        some cases though, JXPath's own caching may not be sufficient-
  +        JXPath caches have limited size and they are cleared once in a
  +        while.
  +      </p>
  +      <p>
  +        Here's how you can precompile an XPath expression:
  +      </p>
  +
  +<!--============================ + SOURCE + ============================-->
   <source>
  -                                                                       <b></b>
  +                                                                       <b/>
        CompiledExpression expr = context.compile(xpath);
        ...
        Object value = expr.getValue(context);
   </source>
  -<p>
  -The following requirements can be addressed with compiled expressions:
  -</p>
  -<ul>
  - <li>There is a relatively small number of XPaths your application
  -   works with, and it needs to evaluate those XPaths multiple times.</li>
  - <li>Some XPaths need to be precompiled at initialization time</li>
  - <li>The syntax of some XPaths needs to be checked before they are
  -   used for the first time</li>
  -</ul>
  -</section>
  -
  -<section name="Customizing JXPath">
  -  <p>
  -  JXPath can be customized on several levels.
  -  </p>
  -  <ul>
  -    <li>You can provide custom JXPathBeanInfo objects to customize lists of
  -        properties of JavaBeans available to JXPath.</li>
  -    <li>You can easily add support for object types similar to Map. All you need
  -        to do is implement the DynamicPropertyHandler interface and register
  -        the implementation with JXPathIntrospector.</li>
  -    <li>You can add support for types of object models JXPath does
  -        not support out of the box. An example of such model would be an alternative
  -        implementation of XML parse tree (e.g. JDOM etc). You will need to
  -        implement one or two APIs to allow JXPath to traverse properties of these
  -        custom objects.</li>
  -    <li>The most dramatic customization of JXPath can be done at the level of
  -        JXPathContextFactory - you can transparently provide an alternative
  -        implementation of all top level APIs.</li>
  -  </ul>
  -
  -  <subsection name="Custom JXPathBeanInfo">
  -    <p>
  -     JXPath uses JavaBeans introspection to discover properties of JavaBeans.
  -     You can provide alternative property lists by supplying
  -     custom JXPathBeanInfo classes (see
  -     <A HREF="api/org/apache/commons/jxpath/JXPathBeanInfo.html"><CODE>JXPathBeanInfo</CODE></A>).
  -    </p>
  -  </subsection>
  -
  -  <subsection name="Custom DynamicPropertyHandler">
  -    <p>
  -     JXPath uses various implementations of the DynamicPropertyHandler interface
  -     to access properties of objects similar to Map.
  -    </p>
  -    <p>
  -     The <code>org.apache.commons.jxpath.servlet</code> package has several
  -     examples of custom DynamicPropertyHandlers.
  -    </p>
  -  </subsection>
  -
  -  <subsection name="Custom Pointers and Iterators">
  -  <p>
  -    Architecturally, multiple model support is
  -    made possible by the notions of a
  -    <a href="api/org/apache/commons/jxpath/ri/model/NodePointer.html">NodePointer</a> and
  -    <a href="api/org/apache/commons/jxpath/ri/model/NodeIterator.html">NodeIterator</a>, which are
  -    simple abstract classes that
  -    are extended in different ways to traverse graphs
  -    of objects of different
  -    kinds.  The NodePointer/NodeIterator APIs are designed with
  -    models like JavaBeans in mind.  They
  -    directly support indexed collections.  As a result,
  -    XPaths like <code>"foo[10]"</code>
  -    can be executed as <code>"getFoo(9)"</code> or <code>"getFoo()[9]"</code>,
  -    or <code>"getFoo().get(9)"</code>,
  -    depending on the type of collection.  This flexibility
  -    is disguised well enough by the APIs of the abstract classes,
  -    so we can still have a natural implementation of traversal of
  -    object models, such as DOM, that do not have the same notion of collection.
  -    </p>
  -    <p>
  -    To add support for a new object model, build custom implementations
  -    of NodePointer and NodeIterator as well as
  -    <a href="api/org/apache/commons/jxpath/ri/model/NodePointerFactory.html">NodePointerFactory</a>.  Then
  -    register the new factory with
  -    <a href="api/org/apache/commons/jxpath/ri/JXPathContextReferenceImpl.html">JXPathContextReferenceImpl</a>.
  -    </p>
  -    <p>
  -     See existing NodePointerFactories for examples of how that's done:
  -     <ul>
  -       <li>BeanPointerFactory works with JavaBeans</li>
  -       <li>DynamicPointerFactory works with Dynamic beans like Map, HttpRequest and such</li>
  -       <li>ContainerPointerFactory works with Container objects like XMLDocumentContainer</li>
  -       <li>DOMPointerFactory works with DOM Nodes</li>
  -     </ul>
  -    </p>
  -  </subsection>
  -
  -  <subsection name="Alternative JXPath Implementation">
  -    <p>
  -     JXPathContext allows alternative implementations. This is why instead of
  -     allocating JXPathContext directly, you should call a static <code>newContext</code>
  -     method.  This method will utilize the JXPathContextFactory API to locate
  -     a suitable implementation of JXPath.
  -     JXPath comes bundled with a default implementation called Reference Implementation.
  -    </p>
  -  </subsection>
  -</section>
  -
  -<section name="Miscellaneous">
  -<ul>
  - <li>The current version of JXPath does not support the <code>id(string)</code>
  -     and <code>key(key, value)</code> XPath functions.</li>
  - </ul>
  -</section>
  +<!--============================ - SOURCE - ============================-->
  +
  +      <p>
  +        The following requirements can be addressed with compiled
  +        expressions:
  +      </p>
  +      <ul>
  +        <li>
  +          There is a relatively small number of XPaths your
  +          application works with, and it needs to evaluate those
  +          XPaths multiple times.
  +        </li>
  +        <li>
  +          Some XPaths need to be precompiled at initialization time
  +        </li>
  +        <li>
  +          The syntax of some XPaths needs to be checked before they
  +          are used for the first time
  +        </li>
  +      </ul>
  +    </section>
  +
  +
  +    <section name="Customizing JXPath">
  +      <p>
  +        JXPath can be customized on several levels.
  +      </p>
  +      <ul>
  +        <li>
  +          You can provide custom JXPathBeanInfo objects to customize
  +          lists of properties of JavaBeans available to JXPath.
  +        </li>
  +        <li>
  +          You can easily add support for object types similar to Map.
  +          All you need to do is implement the DynamicPropertyHandler
  +          interface and register the implementation with
  +          JXPathIntrospector.
  +        </li>
  +        <li>
  +          You can add support for types of object models JXPath does
  +          not support out of the box. An example of such model would
  +          be an alternative implementation of XML parse tree (e.g.
  +          JDOM etc). You will need to implement one or two APIs to
  +          allow JXPath to traverse properties of these custom
  +          objects.
  +        </li>
  +        <li>
  +          The most dramatic customization of JXPath can be done at
  +          the level of JXPathContextFactory- you can transparently
  +          provide an alternative implementation of all top level
  +          APIs.
  +        </li>
  +      </ul>
  +
  +
  +      <subsection name="Custom JXPathBeanInfo">
  +        <p>
  +          JXPath uses JavaBeans introspection to discover properties
  +          of JavaBeans. You can provide alternative property lists by
  +          supplying custom JXPathBeanInfo classes (see
  +          <A HREF="api/org/apache/commons/jxpath/JXPathBeanInfo.html"><CODE>JXPathBeanInfo</CODE></A>).
  +        </p>
  +      </subsection>
  +
  +
  +      <subsection name="Custom DynamicPropertyHandler">
  +        <p>
  +          JXPath uses various implementations of the
  +          DynamicPropertyHandler interface to access properties of
  +          objects similar to Map.
  +        </p>
  +        <p>
  +          The <code>org.apache.commons.jxpath.servlet</code>
  +          package has several examples of custom
  +          DynamicPropertyHandlers.
  +        </p>
  +      </subsection>
  +
  +
  +      <subsection name="Custom Pointers and Iterators">
  +        <p>
  +          Architecturally, multiple model support is made possible by
  +          the notions of a
  +          <a href="api/org/apache/commons/jxpath/ri/model/NodePointer.html">NodePointer</a>
  +          and
  +          <a href="api/org/apache/commons/jxpath/ri/model/NodeIterator.html">NodeIterator</a>,
  +          which are simple abstract classes that are extended in
  +          different ways to traverse graphs of objects of different
  +          kinds. The NodePointer/NodeIterator APIs are designed with
  +          models like JavaBeans in mind. They directly support
  +          indexed collections. As a result, XPaths like
  +          <code>"foo[10]"</code>  can be executed as
  +          <code>"getFoo(9)"</code>  or <code>"getFoo()[9]"</code>,
  +          or <code>"getFoo().get(9)"</code>, depending on the
  +          type of collection. This flexibility is disguised well
  +          enough by the APIs of the abstract classes, so we can still
  +          have a natural implementation of traversal of object
  +          models, such as DOM, that do not have the same notion of
  +          collection.
  +        </p>
  +        <p>
  +          To add support for a new object model, build custom
  +          implementations of NodePointer and NodeIterator as well as
  +          <a href="api/org/apache/commons/jxpath/ri/model/NodePointerFactory.html">NodePointerFactory</a>.
  +          Then register the new factory with
  +          <a href="api/org/apache/commons/jxpath/ri/JXPathContextReferenceImpl.html">JXPathContextReferenceImpl</a>.
  +        </p>
  +        <p>
  +          See existing NodePointerFactories for examples of how
  +          that's done:
  +          <ul>
  +            <li>
  +              BeanPointerFactory works with JavaBeans
  +            </li>
  +            <li>
  +              DynamicPointerFactory works with Dynamic beans like
  +              Map, HttpRequest and such
  +            </li>
  +            <li>
  +              ContainerPointerFactory works with Container
  +              objects like XMLDocumentContainer
  +            </li>
  +            <li>
  +              DOMPointerFactory works with DOM Nodes
  +            </li>
  +          </ul>
  +        </p>
  +      </subsection>
   
  -</body>
  +
  +      <subsection name="Alternative JXPath Implementation">
  +        <p>
  +          JXPathContext allows alternative implementations. This is
  +          why instead of allocating JXPathContext directly, you
  +          should call a static <code>newContext</code>  method.
  +          This method will utilize the JXPathContextFactory API to
  +          locate a suitable implementation of JXPath. JXPath comes
  +          bundled with a default implementation called Reference
  +          Implementation.
  +        </p>
  +      </subsection>
  +    </section>
  +  </body>
   </document>
  
  
  
  1.4       +14 -4     jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/beans/NullPointer.java
  
  Index: NullPointer.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/beans/NullPointer.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- NullPointer.java	8 May 2002 23:05:05 -0000	1.3
  +++ NullPointer.java	8 Jun 2002 22:47:24 -0000	1.4
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/beans/NullPointer.java,v 1.3 2002/05/08 23:05:05 dmitri Exp $
  - * $Revision: 1.3 $
  - * $Date: 2002/05/08 23:05:05 $
  + * $Header: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/beans/NullPointer.java,v 1.4 2002/06/08 22:47:24 dmitri Exp $
  + * $Revision: 1.4 $
  + * $Date: 2002/06/08 22:47:24 $
    *
    * ====================================================================
    * The Apache Software License, Version 1.1
  @@ -69,10 +69,11 @@
   
   /**
    * @author Dmitri Plotnikov
  - * @version $Revision: 1.3 $ $Date: 2002/05/08 23:05:05 $
  + * @version $Revision: 1.4 $ $Date: 2002/06/08 22:47:24 $
    */
   public class NullPointer extends PropertyOwnerPointer {
       private QName name;
  +    private String id;
   
       public NullPointer(QName name, Locale locale){
           super(null, locale);
  @@ -87,6 +88,11 @@
           this.name = name;
       }
   
  +    public NullPointer(Locale locale, String id){
  +        super(null, locale);
  +        this.id = id;
  +    }
  +
       public QName getName(){
           return name;
       }
  @@ -179,6 +185,10 @@
       }
   
       public String asPath(){
  +        if (id != null){
  +            return "id(" + id + ")";
  +        }
  +
           if (parent != null){
               return super.asPath();
           }
  
  
  
  1.6       +19 -4     jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/NodePointer.java
  
  Index: NodePointer.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/NodePointer.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- NodePointer.java	8 May 2002 23:05:04 -0000	1.5
  +++ NodePointer.java	8 Jun 2002 22:47:24 -0000	1.6
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/NodePointer.java,v 1.5 2002/05/08 23:05:04 dmitri Exp $
  - * $Revision: 1.5 $
  - * $Date: 2002/05/08 23:05:04 $
  + * $Header: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/NodePointer.java,v 1.6 2002/06/08 22:47:24 dmitri Exp $
  + * $Revision: 1.6 $
  + * $Date: 2002/06/08 22:47:24 $
    *
    * ====================================================================
    * The Apache Software License, Version 1.1
  @@ -84,7 +84,7 @@
    * context-independent predicates.
    *
    * @author Dmitri Plotnikov
  - * @version $Revision: 1.5 $ $Date: 2002/05/08 23:05:04 $
  + * @version $Revision: 1.6 $ $Date: 2002/06/08 22:47:24 $
    */
   public abstract class NodePointer implements Pointer, Cloneable, Comparable {
   
  @@ -480,6 +480,21 @@
        */
       public QName getExpandedName() {
           return getName();
  +    }
  +
  +    /**
  +     * Locates a node by ID.
  +     */
  +    public Pointer getPointerByID(JXPathContext context, String id){
  +        return context.getPointerByID(id);
  +    }
  +
  +    /**
  +     * Locates a node by key and value.
  +     */
  +    public Pointer getPointerByKey(JXPathContext context,
  +                                      String key, String value){
  +        return context.getPointerByKey(key, value);
       }
   
       /**
  
  
  
  1.10      +90 -10    jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/JXPathContext.java
  
  Index: JXPathContext.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/JXPathContext.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- JXPathContext.java	8 May 2002 23:19:31 -0000	1.9
  +++ JXPathContext.java	8 Jun 2002 22:47:24 -0000	1.10
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/JXPathContext.java,v 1.9 2002/05/08 23:19:31 dmitri Exp $
  - * $Revision: 1.9 $
  - * $Date: 2002/05/08 23:19:31 $
  + * $Header: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/JXPathContext.java,v 1.10 2002/06/08 22:47:24 dmitri Exp $
  + * $Revision: 1.10 $
  + * $Date: 2002/06/08 22:47:24 $
    *
    * ====================================================================
    * The Apache Software License, Version 1.1
  @@ -198,7 +198,7 @@
    * <h3>Example 5: Retrieving Multiple Results</h3>
    *
    * JXPath can retrieve multiple objects from a graph. Note that the method
  - * called in this case is not <code>getValue</code>, but <code>eval</code>.
  + * called in this case is not <code>getValue</code>, but <code>iterate</code>.
    *
    * <pre><blockquote>
    * public class Author {
  @@ -211,7 +211,7 @@
    * ...
    *
    * JXPathContext context = JXPathContext.newContext(auth);
  - * List threeBooks = (List)context.eval("books[position() &lt; 4]");
  + * Iterator threeBooks = context.iterate("books[position() &lt; 4]");
    * </blockquote></pre>
    *
    * This returns a list of at most three books from the array of all books
  @@ -244,7 +244,7 @@
    * <h3>Example 7: Creating objects</h3>
    * JXPath can be used to create new objects. First, create a subclass of
    * {@link AbstractFactory AbstractFactory} and install it on the JXPathContext.
  - * Then call {@link JXPathContext#createPath createPath()} instead of "setValue".
  + * Then call {@link JXPathContext#createPath createPathAndSetValue()} instead of "setValue".
    * JXPathContext will invoke your AbstractFactory when it discovers that an
    * intermediate node of the path is <b>null</b>.  It will not override existing
    * nodes.
  @@ -262,7 +262,7 @@
    *
    * JXPathContext context = JXPathContext.newContext(emp);
    * context.setFactory(new AddressFactory());
  - * context.createPath("address/zipCode", "90190");
  + * context.createPathAndSetValue("address/zipCode", "90190");
    * </blockquote></pre>
    *
    * <h3>Example 8: Using Variables</h3>
  @@ -321,7 +321,7 @@
    *
    * JXPathContext context = JXPathContext.newContext(varContext, auth);
    *
  - * List javaBooks = (List)context.eval("books[title = $title]");
  + * Iterator javaBooks = context.iterate("books[title = $title]");
    * </blockquote></pre>
    *
    * <h3>Using Custom Variable Pools</h3>
  @@ -404,7 +404,7 @@
    * Also see <a href="http://www.w3.org/TR/xpath">XML Path Language (XPath) Version 1.0 </a>
    *
    * @author Dmitri Plotnikov
  - * @version $Revision: 1.9 $ $Date: 2002/05/08 23:19:31 $
  + * @version $Revision: 1.10 $ $Date: 2002/06/08 22:47:24 $
    */
   public abstract class JXPathContext {
       protected JXPathContext parentContext;
  @@ -414,6 +414,8 @@
       protected AbstractFactory factory;
       protected Locale locale;
       protected boolean lenient = false;
  +    protected IdentityManager idManager;
  +    protected KeyManager keyManager;
   
       private static JXPathContext compilationContext;
   
  @@ -456,6 +458,11 @@
           return contextBean;
       }
   
  +    /**
  +     * Returns a Pointer for the context bean.
  +     */
  +    public abstract Pointer getContextPointer();
  +
       public void setVariables(Variables vars){
           this.vars = vars;
       }
  @@ -513,7 +520,12 @@
        */
       protected Locale getLocale(){
           if (locale == null){
  -            locale = Locale.getDefault();
  +            if (parentContext != null){
  +                return parentContext.getLocale();
  +            }
  +            else {
  +                locale = Locale.getDefault();
  +            }
           }
           return locale;
       }
  @@ -677,4 +689,72 @@
        * in the graph, the Iterator be empty, but not null.
        */
       public abstract Iterator iteratePointers(String xpath);
  +
  +    /**
  +     * Install an identity manager that will be used by the context
  +     * to look up a node by its ID.
  +     */
  +    public void setIdentityManager(IdentityManager idManager){
  +        this.idManager = idManager;
  +    }
  +
  +    /**
  +     * Returns this context's identity manager. If none has been installed,
  +     * returns the identity manager of the parent context.
  +     */
  +    public IdentityManager getIdentityManager(){
  +        if (idManager == null && parentContext != null){
  +            return parentContext.getIdentityManager();
  +        }
  +        return idManager;
  +    }
  +
  +    /**
  +     * Locates a Node by its ID.
  +     *
  +     * @param id is the ID of the sought node.
  +     */
  +    public Pointer getPointerByID(String id){
  +        IdentityManager manager = getIdentityManager();
  +        if (manager != null){
  +            return manager.getPointerByID(this, id);
  +        }
  +        else {
  +            throw new JXPathException("Cannot find an element by ID - " +
  +                "no IdentityManager has been specified");
  +        }
  +    }
  +
  +    /**
  +     * Install a key manager that will be used by the context
  +     * to look up a node by a key value.
  +     */
  +    public void setKeyManager(KeyManager keyManager){
  +        this.keyManager = keyManager;
  +    }
  +
  +    /**
  +     * Returns this context's key manager. If none has been installed,
  +     * returns the key manager of the parent context.
  +     */
  +    public KeyManager getKeyManager(){
  +        if (keyManager == null && parentContext != null){
  +            return parentContext.getKeyManager();
  +        }
  +        return keyManager;
  +    }
  +
  +    /**
  +     * Locates a Node by a key value.
  +     */
  +    public Pointer getPointerByKey(String key, String value){
  +        KeyManager manager = getKeyManager();
  +        if (manager != null){
  +            return manager.getPointerByKey(this, key, value);
  +        }
  +        else {
  +            throw new JXPathException("Cannot find an element by key - " +
  +                "no KeyManager has been specified");
  +        }
  +    }
   }
  
  
  
  1.1                  jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/KeyManager.java
  
  Index: KeyManager.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/KeyManager.java,v 1.1 2002/06/08 22:47:24 dmitri Exp $
   * $Revision: 1.1 $
   * $Date: 2002/06/08 22:47:24 $
   *
   * ====================================================================
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 1999-2001 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 2001, Plotnix, Inc,
   * <http://www.plotnix.com/>.
   * For more information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.commons.jxpath;
  
  /**
   * A delegate of JXPathContext that implements the XPath <code>"key()"</code>
   * function.
   *
   * @author Dmitri Plotnikov
   * @version $Revision: 1.1 $ $Date: 2002/06/08 22:47:24 $
   */
  public interface KeyManager {
  
      /**
       * Finds a node by a key value.
       */
      Pointer getPointerByKey(JXPathContext context, String keyName, String keyValue);
  }
  
  
  1.1                  jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/IdentityManager.java
  
  Index: IdentityManager.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/IdentityManager.java,v 1.1 2002/06/08 22:47:24 dmitri Exp $
   * $Revision: 1.1 $
   * $Date: 2002/06/08 22:47:24 $
   *
   * ====================================================================
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 1999-2001 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 2001, Plotnix, Inc,
   * <http://www.plotnix.com/>.
   * For more information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.commons.jxpath;
  
  /**
   * A delegate of JXPathContext that implements the XPath <code>"id()"</code>
   * function. This delegate is only used when there is no default implementation
   * of the <code>id()</code> function. For example, it is <i>not</i> used
   * when the root of the context is a DOM Node.
   *
   * @author Dmitri Plotnikov
   * @version $Revision: 1.1 $ $Date: 2002/06/08 22:47:24 $
   */
  public interface IdentityManager {
  
      /**
       * Finds a node by its ID.
       */
      Pointer getPointerByID(JXPathContext context, String id);
  }
  
  
  1.19      +6 -6      jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/JXPathContextReferenceImpl.java
  
  Index: JXPathContextReferenceImpl.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/JXPathContextReferenceImpl.java,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- JXPathContextReferenceImpl.java	29 May 2002 00:41:53 -0000	1.18
  +++ JXPathContextReferenceImpl.java	8 Jun 2002 22:47:25 -0000	1.19
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/JXPathContextReferenceImpl.java,v 1.18 2002/05/29 00:41:53 dmitri Exp $
  - * $Revision: 1.18 $
  - * $Date: 2002/05/29 00:41:53 $
  + * $Header: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/JXPathContextReferenceImpl.java,v 1.19 2002/06/08 22:47:25 dmitri Exp $
  + * $Revision: 1.19 $
  + * $Date: 2002/06/08 22:47:25 $
    *
    * ====================================================================
    * The Apache Software License, Version 1.1
  @@ -83,7 +83,7 @@
    * The reference implementation of JXPathContext.
    *
    * @author Dmitri Plotnikov
  - * @version $Revision: 1.18 $ $Date: 2002/05/29 00:41:53 $
  + * @version $Revision: 1.19 $ $Date: 2002/06/08 22:47:25 $
    */
   public class JXPathContextReferenceImpl extends JXPathContext
   {
  @@ -404,7 +404,7 @@
           }
       }
   
  -    private synchronized NodePointer getRootPointer(){
  +    public synchronized Pointer getContextPointer(){
           if (rootPointer == null){
               rootPointer = NodePointer.newNodePointer(new QName(null, "root"),
                   getContextBean(), getLocale());
  @@ -413,7 +413,7 @@
       }
   
       private EvalContext getRootContext(){
  -        return new RootContext(this, getRootPointer());
  +        return new RootContext(this, (NodePointer)getContextPointer());
       }
   
       public NodePointer getVariablePointer(QName name){
  
  
  
  1.4       +5 -5      jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/Compiler.java
  
  Index: Compiler.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/Compiler.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- Compiler.java	24 Apr 2002 04:05:40 -0000	1.3
  +++ Compiler.java	8 Jun 2002 22:47:25 -0000	1.4
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/Compiler.java,v 1.3 2002/04/24 04:05:40 dmitri Exp $
  - * $Revision: 1.3 $
  - * $Date: 2002/04/24 04:05:40 $
  + * $Header: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/Compiler.java,v 1.4 2002/06/08 22:47:25 dmitri Exp $
  + * $Revision: 1.4 $
  + * $Date: 2002/06/08 22:47:25 $
    *
    * ====================================================================
    * The Apache Software License, Version 1.1
  @@ -86,7 +86,7 @@
    * </pre></blockquote>
    *
    * @author Dmitri Plotnikov
  - * @version $Revision: 1.3 $ $Date: 2002/04/24 04:05:40 $
  + * @version $Revision: 1.4 $ $Date: 2002/06/08 22:47:25 $
    */
   public interface Compiler {
   
  @@ -137,7 +137,7 @@
       public static final int FUNCTION_CEILING = 26;
       public static final int FUNCTION_ROUND = 27;
       public static final int FUNCTION_NULL = 28;
  -//    public static final int FUNCTION_KEY = 29;
  +    public static final int FUNCTION_KEY = 29;
   
       /**
        * Produces an EXPRESSION object that represents a numeric constant.
  
  
  
  1.7       +52 -4     jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/dom/DOMNodePointer.java
  
  Index: DOMNodePointer.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/dom/DOMNodePointer.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- DOMNodePointer.java	29 May 2002 00:40:58 -0000	1.6
  +++ DOMNodePointer.java	8 Jun 2002 22:47:25 -0000	1.7
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/dom/DOMNodePointer.java,v 1.6 2002/05/29 00:40:58 dmitri Exp $
  - * $Revision: 1.6 $
  - * $Date: 2002/05/29 00:40:58 $
  + * $Header: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/model/dom/DOMNodePointer.java,v 1.7 2002/06/08 22:47:25 dmitri Exp $
  + * $Revision: 1.7 $
  + * $Date: 2002/06/08 22:47:25 $
    *
    * ====================================================================
    * The Apache Software License, Version 1.1
  @@ -68,17 +68,20 @@
   import org.apache.commons.jxpath.AbstractFactory;
   import org.apache.commons.jxpath.JXPathContext;
   import org.apache.commons.jxpath.JXPathException;
  +import org.apache.commons.jxpath.Pointer;
   import org.apache.commons.jxpath.ri.Compiler;
   import org.apache.commons.jxpath.ri.QName;
   import org.apache.commons.jxpath.ri.compiler.NodeNameTest;
   import org.apache.commons.jxpath.ri.compiler.NodeTest;
   import org.apache.commons.jxpath.ri.compiler.NodeTypeTest;
   import org.apache.commons.jxpath.ri.compiler.ProcessingInstructionTest;
  +import org.apache.commons.jxpath.ri.model.beans.NullPointer;
   import org.apache.commons.jxpath.ri.model.NodeIterator;
   import org.apache.commons.jxpath.ri.model.NodePointer;
   import org.apache.commons.jxpath.util.TypeUtils;
   import org.w3c.dom.Attr;
   import org.w3c.dom.Comment;
  +import org.w3c.dom.Document;
   import org.w3c.dom.Element;
   import org.w3c.dom.NamedNodeMap;
   import org.w3c.dom.Node;
  @@ -89,12 +92,13 @@
    * A Pointer that points to a DOM node.
    *
    * @author Dmitri Plotnikov
  - * @version $Revision: 1.6 $ $Date: 2002/05/29 00:40:58 $
  + * @version $Revision: 1.7 $ $Date: 2002/06/08 22:47:25 $
    */
   public class DOMNodePointer extends NodePointer {
       private Node node;
       private Map namespaces;
       private String defaultNamespace;
  +    private String id;
   
       public static final String XML_NAMESPACE_URI = "http://www.w3.org/XML/1998/namespace";
       public static final String XMLNS_NAMESPACE_URI = "http://www.w3.org/2000/xmlns/";
  @@ -104,6 +108,12 @@
           this.node = node;
       }
   
  +    public DOMNodePointer(Node node, Locale locale, String id){
  +        super(null, locale);
  +        this.node = node;
  +        this.id = id;
  +    }
  +
       public DOMNodePointer(NodePointer parent, Node node){
           super(parent);
           this.node = node;
  @@ -399,6 +409,10 @@
       }
   
       public String asPath(){
  +        if (id != null){
  +            return "id('" + escape(id) + "')";
  +        }
  +
           StringBuffer buffer = new StringBuffer();
           if (parent != null){
               buffer.append(parent.asPath());
  @@ -430,6 +444,20 @@
           return buffer.toString();
       }
   
  +    private String escape(String string){
  +        int index = string.indexOf('\'');
  +        while (index != -1){
  +            string = string.substring(0, index) + "&apos;" + string.substring(index + 1);
  +            index = string.indexOf('\'');
  +        }
  +        index = string.indexOf('\"');
  +        while (index != -1){
  +            string = string.substring(0, index) + "&quot;" + string.substring(index + 1);
  +            index = string.indexOf('\"');
  +        }
  +        return string;
  +    }
  +
       private int getRelativePositionByName(){
           int count = 1;
           Node n = node.getPreviousSibling();
  @@ -549,6 +577,26 @@
                   }
               }
               return buf.toString().trim();
  +        }
  +    }
  +
  +    /**
  +     * Locates a node by ID.
  +     */
  +    public Pointer getPointerByID(JXPathContext context, String id){
  +        Document document;
  +        if (node.getNodeType() == Node.DOCUMENT_NODE){
  +            document = (Document)node;
  +        }
  +        else {
  +            document = node.getOwnerDocument();
  +        }
  +        Element element = document.getElementById(id);
  +        if (element != null){
  +            return new DOMNodePointer(element, getLocale(), id);
  +        }
  +        else {
  +            return new NullPointer(getLocale(), id);
           }
       }
   
  
  
  
  1.5       +25 -12    jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/compiler/CoreFunction.java
  
  Index: CoreFunction.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/compiler/CoreFunction.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- CoreFunction.java	8 May 2002 00:39:59 -0000	1.4
  +++ CoreFunction.java	8 Jun 2002 22:47:25 -0000	1.5
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/compiler/CoreFunction.java,v 1.4 2002/05/08 00:39:59 dmitri Exp $
  - * $Revision: 1.4 $
  - * $Date: 2002/05/08 00:39:59 $
  + * $Header: /home/cvs/jakarta-commons/jxpath/src/java/org/apache/commons/jxpath/ri/compiler/CoreFunction.java,v 1.5 2002/06/08 22:47:25 dmitri Exp $
  + * $Revision: 1.5 $
  + * $Date: 2002/06/08 22:47:25 $
    *
    * ====================================================================
    * The Apache Software License, Version 1.1
  @@ -61,6 +61,7 @@
    */
   package org.apache.commons.jxpath.ri.compiler;
   
  +import org.apache.commons.jxpath.JXPathContext;
   import org.apache.commons.jxpath.JXPathException;
   import org.apache.commons.jxpath.ri.Compiler;
   import org.apache.commons.jxpath.ri.InfoSetUtil;
  @@ -75,7 +76,7 @@
    * like "position()" or "number()".
    *
    * @author Dmitri Plotnikov
  - * @version $Revision: 1.4 $ $Date: 2002/05/08 00:39:59 $
  + * @version $Revision: 1.5 $ $Date: 2002/06/08 22:47:25 $
    */
   public class CoreFunction extends Operation {
   
  @@ -188,7 +189,7 @@
               case Compiler.FUNCTION_FLOOR:            function = "floor"; break;
               case Compiler.FUNCTION_CEILING:          function = "ceiling"; break;
               case Compiler.FUNCTION_ROUND:            function = "round"; break;
  -//            case Compiler.FUNCTION_KEY:            function = "key"; break;
  +            case Compiler.FUNCTION_KEY:              function = "key"; break;
           }
           return super.opCodeToString() + ':' + function;
       }
  @@ -206,11 +207,7 @@
               case Compiler.FUNCTION_POSITION:            return functionPosition(context);
               case Compiler.FUNCTION_COUNT:               return functionCount(context);
               case Compiler.FUNCTION_LANG:                return functionLang(context);
  -            case Compiler.FUNCTION_ID:
  -            {
  -                System.err.println("UNIMPLEMENTED: " + this);
  -                return null;
  -            }
  +            case Compiler.FUNCTION_ID:                  return functionID(context);
               case Compiler.FUNCTION_LOCAL_NAME:          return functionLocalName(context);
               case Compiler.FUNCTION_NAMESPACE_URI:       return functionNamespaceURI(context);
               case Compiler.FUNCTION_NAME:                return functionName(context);
  @@ -234,8 +231,7 @@
               case Compiler.FUNCTION_FLOOR:               return functionFloor(context);
               case Compiler.FUNCTION_CEILING:             return functionCeiling(context);
               case Compiler.FUNCTION_ROUND:               return functionRound(context);
  -//            case Compiler.FUNCTION_KEY:
  -//                System.err.println("UNIMPLEMENTED: " + function);
  +            case Compiler.FUNCTION_KEY:                 return functionKey(context);
           }
           return null;
       }
  @@ -298,6 +294,23 @@
               return Boolean.FALSE;
           }
           return pointer.isLanguage(lang) ? Boolean.TRUE: Boolean.FALSE;
  +    }
  +
  +    protected Object functionID(EvalContext context){
  +        assertArgCount(1);
  +        String id = InfoSetUtil.stringValue(getArg1().computeValue(context));
  +        JXPathContext jxpathContext = context.getJXPathContext();
  +        NodePointer pointer = (NodePointer)jxpathContext.getContextPointer();
  +        return pointer.getPointerByID(jxpathContext, id);
  +    }
  +
  +    protected Object functionKey(EvalContext context){
  +        assertArgCount(2);
  +        String key = InfoSetUtil.stringValue(getArg1().computeValue(context));
  +        String value = InfoSetUtil.stringValue(getArg2().computeValue(context));
  +        JXPathContext jxpathContext = context.getJXPathContext();
  +        NodePointer pointer = (NodePointer)jxpathContext.getContextPointer();
  +        return pointer.getPointerByKey(jxpathContext, key, value);
       }
   
       protected Object functionNamespaceURI(EvalContext context){
  
  
  

--
To unsubscribe, e-mail:   <mailto:commons-dev-unsubscribe@jakarta.apache.org>
For additional commands, e-mail: <mailto:commons-dev-help@jakarta.apache.org>


Mime
View raw message