Daniel,

thanks, it was a bug, and one pretty hard to trace. Apply the enclosed
patch in the engine subdirectory. I'll be grateful if you test it in a
few more situations.

Tom

------------------------------------patch begins
Index: expr.cpp
===================================================================
RCS file: d:/cvs-master/ga/src/Sablot/engine/expr.cpp,v
retrieving revision 1.18
diff -a -u -r1.18 expr.cpp
--- expr.cpp    2000/09/12 14:50:08     1.18
+++ expr.cpp    2000/10/21 15:39:58
@@ -3021,12 +3029,12 @@
 }
 */
 
-eFlag Expression::createLPContext(Context *&c, int baseNdx)
+eFlag Expression::createLPContext(Context *&c, int baseNdx, Vertex
*givenGlobalCurrent /* = NULL */)
 {
     assert(functor == EXF_LOCPATH);
     Context *theResult = new Context,
         info;
-    info.setCurrentNode(c -> current());
+    info.setCurrentNode(givenGlobalCurrent ? givenGlobalCurrent : c ->
current());
     theResult -> setCurrentNode(c -> getCurrentNode());
     E( createLPContextLevel(0, args.number(), c -> current(), info,
theResult) );
     theResult -> sort();
@@ -3124,7 +3132,7 @@
 }
 
 
-eFlag Expression::createLPContextSum(Context *&c)
+eFlag Expression::createLPContextSum(Context *&c, Vertex *globalCurrent
/* = NULL */)
 {
     assert(functor == EXF_LOCPATH);
     Context 
@@ -3133,7 +3141,7 @@
     int cNumber = c -> getSize();
     for (int j = 0; j < cNumber; j++)
     {
-        E( createLPContext(returnedc = c, j) );
+        E( createLPContext(returnedc = c, j, globalCurrent) );
         newc2 = newc -> swallow(returnedc);
         delete newc;
         newc = newc2;
@@ -3204,6 +3212,11 @@
         {
             assert(baseNdx != -1);  // meaningful only for a locpath
             E( args[0] -> createContext(newc = c, baseNdx) );
+
+            /// tom 21-10-00
+            /// wild guess:
+            newc -> setCurrentNode(c -> getCurrentNode());
+
             Context *filteredc;
             for (i = 1; i < argsNumber - (int) hasPath; i++)
             {
@@ -3224,7 +3237,7 @@
             };
             if (hasPath)
             {
-                E( args[argsNumber-1] -> createLPContextSum(filteredc =
newc) );
+                E( args[argsNumber-1] -> createLPContextSum(filteredc =
newc, newc -> getCurrentNode()) );
                 delete newc;
                 newc = filteredc;
             }
Index: expr.h
===================================================================
RCS file: d:/cvs-master/ga/src/Sablot/engine/expr.h,v
retrieving revision 1.8
diff -a -u -r1.8 expr.h
--- expr.h      2000/08/11 15:00:37     1.8
+++ expr.h      2000/10/21 15:19:05
@@ -372,8 +372,8 @@
     eFlag matchesSingleStep(Vertex *v, Bool &result);
     eFlag createLPContextLevel(int stepLevel, int stepsCount,
         Vertex *base, Context& info, Context *theResult);
-    eFlag createLPContext(Context *&, int);
-    eFlag createLPContextSum(Context *&);
+    eFlag createLPContext(Context *&, int, Vertex *globalCurrent =
NULL);
+    eFlag createLPContextSum(Context *&, Vertex *globalCurrent = NULL);
 
     Bool 
         isPattern;
------------------------------------patch ends

> "Hammond, Daniel" wrote:
> 
> I am using the .44 Windows version.  I was wrong, the function present
> since it runs my stylesheet without complaints.  Before it was
> supported, current() used to exit with an error.  I think I have found
> an odd case where current() doesn't seem to work though.  The
> following xml and xsl files generate the expected output when using
> Saxon but not using Sablotron:
> 
> Note:  There are a couple of lines in the XSL file that are commented
> out.  If you uncomment these, and comment out the line directly above
> each, everything works as expected (Assuming cat.xml is passed into
> Sablotron on the command line).

Reply via email to