Here are some of my smaller patches rebased against trunk and formatted with git format-patch. I don't really remember about all of them, but I think they should be safe to apply. The fix for bug #602515 is also included.

Nick
>From fada724b7c5397d7810308fbff4fd711bb3933a1 Mon Sep 17 00:00:00 2001
From: Nick Wellnhofer <[email protected]>
Date: Sat, 7 Nov 2009 18:41:23 +0100
Subject: [PATCH 1/8] Fix direct pattern matching bug

---
 libxslt/pattern.c         |    6 +++++-
 tests/docs/bug-170.xml    |    3 +++
 tests/general/Makefile.am |    1 +
 tests/general/bug-170.out |    4 ++++
 tests/general/bug-170.xsl |    6 ++++++
 5 files changed, 19 insertions(+), 1 deletions(-)
 create mode 100644 tests/docs/bug-170.xml
 create mode 100644 tests/general/bug-170.out
 create mode 100644 tests/general/bug-170.xsl

diff --git a/libxslt/pattern.c b/libxslt/pattern.c
index 8ce74e3..58bd6ed 100644
--- a/libxslt/pattern.c
+++ b/libxslt/pattern.c
@@ -546,13 +546,15 @@ xsltTestCompMatchDirect(xsltTransformContextPtr ctxt, 
xsltCompMatchPtr comp,
        xmlNodePtr parent = node->parent;
        xmlDocPtr olddoc;
        xmlNodePtr oldnode;
-       int oldNsNr;
+       int oldNsNr, oldContextSize, oldProximityPosition;
        xmlNsPtr *oldNamespaces;
 
        oldnode = ctxt->xpathCtxt->node;
        olddoc = ctxt->xpathCtxt->doc;
        oldNsNr = ctxt->xpathCtxt->nsNr;
        oldNamespaces = ctxt->xpathCtxt->namespaces;
+       oldContextSize = ctxt->xpathCtxt->contextSize;
+       oldProximityPosition = ctxt->xpathCtxt->proximityPosition;
        ctxt->xpathCtxt->node = node;
        ctxt->xpathCtxt->doc = doc;
        ctxt->xpathCtxt->namespaces = nsList;
@@ -562,6 +564,8 @@ xsltTestCompMatchDirect(xsltTransformContextPtr ctxt, 
xsltCompMatchPtr comp,
        ctxt->xpathCtxt->doc = olddoc;
        ctxt->xpathCtxt->namespaces = oldNamespaces;
        ctxt->xpathCtxt->nsNr = oldNsNr;
+       ctxt->xpathCtxt->contextSize = oldContextSize;
+       ctxt->xpathCtxt->proximityPosition = oldProximityPosition;
        if (newlist == NULL)
            return(-1);
        if (newlist->type != XPATH_NODESET) {
diff --git a/tests/docs/bug-170.xml b/tests/docs/bug-170.xml
new file mode 100644
index 0000000..08c3c4d
--- /dev/null
+++ b/tests/docs/bug-170.xml
@@ -0,0 +1,3 @@
+<root>
+    <a type="b"/>
+</root>
diff --git a/tests/general/Makefile.am b/tests/general/Makefile.am
index 5d5baf0..e33a6c6 100644
--- a/tests/general/Makefile.am
+++ b/tests/general/Makefile.am
@@ -177,6 +177,7 @@ EXTRA_DIST = \
     bug-167.out bug-167.xsl \
     bug-168.out bug-168.xsl \
     bug-169.out bug-169.xsl bug-169.imp \
+    bug-170.out bug-170.xsl \
     character.out character.xsl \
     character2.out character2.xsl \
     itemschoose.out itemschoose.xsl \
diff --git a/tests/general/bug-170.out b/tests/general/bug-170.out
new file mode 100644
index 0000000..e24f8d3
--- /dev/null
+++ b/tests/general/bug-170.out
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+
+    
+
diff --git a/tests/general/bug-170.xsl b/tests/general/bug-170.xsl
new file mode 100644
index 0000000..393bc4b
--- /dev/null
+++ b/tests/general/bug-170.xsl
@@ -0,0 +1,6 @@
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
+    <xsl:template match="a...@type='b']" >
+        <xsl:if test="position()"/>
+    </xsl:template>
+    <xsl:template match="a...@type='XX'][.]"/>
+</xsl:stylesheet>
-- 
1.7.2.3

>From 668db6ced6451145d0a57543cc3e6e951827d1bc Mon Sep 17 00:00:00 2001
From: Nick Wellnhofer <[email protected]>
Date: Thu, 3 Dec 2009 01:56:22 +0100
Subject: [PATCH 2/8] Fix popping of vars in xsltCompilerNodePop

---
 libxslt/xslt.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/libxslt/xslt.c b/libxslt/xslt.c
index dd58f81..8e8c414 100644
--- a/libxslt/xslt.c
+++ b/libxslt/xslt.c
@@ -2437,13 +2437,13 @@ xsltCompilerNodePop(xsltCompilerCtxtPtr cctxt, 
xmlNodePtr node)
        "xsltCompilerNodePop: Depth mismatch.\n");
        goto mismatch;
     }
+    cctxt->depth--;
     /*
     * Pop information of variables.
     */
     if ((cctxt->ivar) && (cctxt->ivar->depth > cctxt->depth))
        xsltCompilerVarInfoPop(cctxt);
 
-    cctxt->depth--;
     cctxt->inode = cctxt->inode->prev;
     if (cctxt->inode != NULL)
        cctxt->inode->curChildType = 0;
-- 
1.7.2.3

>From b66b71f71a9e5298ac8c4d83bf66e3b412dcde67 Mon Sep 17 00:00:00 2001
From: Nick Wellnhofer <[email protected]>
Date: Tue, 29 Dec 2009 06:13:17 +0100
Subject: [PATCH 3/8] Fix bug 602515

Pattern matching with predicates
---
 libxslt/pattern.c         |   17 ++++++++---------
 tests/docs/bug-171.xml    |    4 ++++
 tests/general/Makefile.am |    1 +
 tests/general/bug-171.out |    2 ++
 tests/general/bug-171.xsl |    7 +++++++
 5 files changed, 22 insertions(+), 9 deletions(-)
 create mode 100644 tests/docs/bug-171.xml
 create mode 100644 tests/general/bug-171.out
 create mode 100644 tests/general/bug-171.xsl

diff --git a/libxslt/pattern.c b/libxslt/pattern.c
index 58bd6ed..6161376 100644
--- a/libxslt/pattern.c
+++ b/libxslt/pattern.c
@@ -888,11 +888,10 @@ restart:
                    (node->type == XML_ELEMENT_NODE) &&
                    (node->parent != NULL)) {
                    xmlNodePtr previous;
-                   int ix, nocache = 0;
+                   int nocache = 0;
 
                    previous = (xmlNodePtr)
                        XSLT_RUNTIME_EXTRA(ctxt, sel->previousExtra, ptr);
-                   ix = XSLT_RUNTIME_EXTRA(ctxt, sel->indexExtra, ival);
                    if ((previous != NULL) &&
                        (previous->parent == node->parent)) {
                        /*
@@ -904,7 +903,7 @@ restart:
                        while (sibling != NULL) {
                            if (sibling == previous)
                                break;
-                           if ((previous->type == XML_ELEMENT_NODE) &&
+                           if ((sibling->type == XML_ELEMENT_NODE) &&
                                (previous->name != NULL) &&
                                (sibling->name != NULL) &&
                                (previous->name[0] == sibling->name[0]) &&
@@ -925,7 +924,7 @@ restart:
                            while (sibling != NULL) {
                                if (sibling == previous)
                                    break;
-                               if ((previous->type == XML_ELEMENT_NODE) &&
+                               if ((sibling->type == XML_ELEMENT_NODE) &&
                                    (previous->name != NULL) &&
                                    (sibling->name != NULL) &&
                                    (previous->name[0] == sibling->name[0]) &&
@@ -943,7 +942,8 @@ restart:
                            }
                        }
                        if (sibling != NULL) {
-                           pos = ix + indx;
+                           pos = XSLT_RUNTIME_EXTRA(ctxt,
+                                sel->indexExtra, ival) + indx;
                            /*
                             * If the node is in a Value Tree we need to
                             * save len, but cannot cache the node!
@@ -959,7 +959,6 @@ restart:
                                        sel->indexExtra, ival) = pos;
                                }
                            }
-                           ix = pos;
                        } else
                            pos = 0;
                    } else {
@@ -1020,11 +1019,10 @@ restart:
                } else if ((sel != NULL) && (sel->op == XSLT_OP_ALL) &&
                           (node->type == XML_ELEMENT_NODE)) {
                    xmlNodePtr previous;
-                   int ix, nocache = 0;
+                   int nocache = 0;
 
                    previous = (xmlNodePtr)
                        XSLT_RUNTIME_EXTRA(ctxt, sel->previousExtra, ptr);
-                   ix = XSLT_RUNTIME_EXTRA(ctxt, sel->indexExtra, ival);
                    if ((previous != NULL) &&
                        (previous->parent == node->parent)) {
                        /*
@@ -1053,7 +1051,8 @@ restart:
                            }
                        }
                        if (sibling != NULL) {
-                           pos = ix + indx;
+                           pos = XSLT_RUNTIME_EXTRA(ctxt,
+                                sel->indexExtra, ival) + indx;
                            /*
                             * If the node is in a Value Tree we cannot
                             * cache it !
diff --git a/tests/docs/bug-171.xml b/tests/docs/bug-171.xml
new file mode 100644
index 0000000..658021b
--- /dev/null
+++ b/tests/docs/bug-171.xml
@@ -0,0 +1,4 @@
+<root>
+  <text>one</text>
+  <text>two</text>
+</root>
diff --git a/tests/general/Makefile.am b/tests/general/Makefile.am
index e33a6c6..7207e15 100644
--- a/tests/general/Makefile.am
+++ b/tests/general/Makefile.am
@@ -178,6 +178,7 @@ EXTRA_DIST = \
     bug-168.out bug-168.xsl \
     bug-169.out bug-169.xsl bug-169.imp \
     bug-170.out bug-170.xsl \
+    bug-171.out bug-171.xsl \
     character.out character.xsl \
     character2.out character2.xsl \
     itemschoose.out itemschoose.xsl \
diff --git a/tests/general/bug-171.out b/tests/general/bug-171.out
new file mode 100644
index 0000000..5b87d4f
--- /dev/null
+++ b/tests/general/bug-171.out
@@ -0,0 +1,2 @@
+<?xml version="1.0"?>
+two
diff --git a/tests/general/bug-171.xsl b/tests/general/bug-171.xsl
new file mode 100644
index 0000000..25a7c94
--- /dev/null
+++ b/tests/general/bug-171.xsl
@@ -0,0 +1,7 @@
+<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
+  <xsl:template match="text[2]">
+    <xsl:value-of select="."/>
+  </xsl:template>
+
+  <xsl:template match="text()"/>
+</xsl:transform>
-- 
1.7.2.3

>From b60140391ea48ea783d4ee9db3562cfbd6060497 Mon Sep 17 00:00:00 2001
From: Nick Wellnhofer <[email protected]>
Date: Tue, 29 Dec 2009 09:19:50 +0100
Subject: [PATCH 4/8] Small fixes to locale code

---
 libxslt/xsltlocale.c |    9 +++++----
 1 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/libxslt/xsltlocale.c b/libxslt/xsltlocale.c
index ec03cde..2caa2ec 100644
--- a/libxslt/xsltlocale.c
+++ b/libxslt/xsltlocale.c
@@ -26,9 +26,9 @@
 #define LC_COLLATE_MASK (1 << LC_COLLATE)
 #endif
 
-#define ISALPHA(c) ((c & 0xc0) == 0x40 && (unsigned)((c & 0x1f) - 1) < 26)
 #define TOUPPER(c) (c & ~0x20)
 #define TOLOWER(c) (c | 0x20)
+#define ISALPHA(c) ((unsigned)(TOUPPER(c) - 'A') < 26)
 
 /*without terminating null character*/
 #define XSLTMAX_ISO639LANGLEN          8
@@ -97,11 +97,11 @@ xsltNewLocale(const xmlChar *languageTag) {
        return(NULL);
     
     llen = i;
-    *q++ = '_';
     
     if (*p) {
        if (*p++ != '-')
            return(NULL);
+        *q++ = '_';
        
        for (i=0; i<XSLTMAX_ISO3166CNTRYLEN && ISALPHA(*p); ++i)
            *q++ = TOUPPER(*p++);
@@ -116,7 +116,7 @@ xsltNewLocale(const xmlChar *languageTag) {
         
         /* Continue without using country code */
         
-        q = localeName + llen + 1;
+        q = localeName + llen;
     }
     
     /* Try locale without territory, e.g. for Esperanto (eo) */
@@ -135,7 +135,8 @@ xsltNewLocale(const xmlChar *languageTag) {
     if (region == NULL)
         return(NULL);
      
-    q = localeName + llen + 1;
+    q = localeName + llen;
+    *q++ = '_';
     *q++ = region[0];
     *q++ = region[1];
     memcpy(q, ".utf8", 6);
-- 
1.7.2.3

>From c03cdd89eda89ea2a493dbce2514bf1526a86901 Mon Sep 17 00:00:00 2001
From: Nick Wellnhofer <[email protected]>
Date: Wed, 10 Feb 2010 02:05:41 +0100
Subject: [PATCH 5/8] Allow whitespace in xsl:variable with select

Comments are also allowed
---
 libxslt/preproc.c |   18 +++++++++++++++++-
 1 files changed, 17 insertions(+), 1 deletions(-)

diff --git a/libxslt/preproc.c b/libxslt/preproc.c
index b47d809..0e39343 100644
--- a/libxslt/preproc.c
+++ b/libxslt/preproc.c
@@ -1844,6 +1844,9 @@ xsltVariableComp(xsltStylesheetPtr style, xmlNodePtr 
inst) {
     comp->select = xsltGetCNsProp(style, inst, (const xmlChar *)"select",
                                XSLT_NAMESPACE);
     if (comp->select != NULL) {
+#ifndef XSLT_REFACTORED
+        xmlNodePtr cur;
+#endif
        comp->comp = xsltXPathCompile(style, comp->select);
        if (comp->comp == NULL) {
            xsltTransformError(NULL, style, inst,
@@ -1851,12 +1854,25 @@ xsltVariableComp(xsltStylesheetPtr style, xmlNodePtr 
inst) {
                comp->select);
            style->errors++;
        }
+#ifdef XSLT_REFACTORED
        if (inst->children != NULL) {
            xsltTransformError(NULL, style, inst,
-               "XSLT-variable: The must be no child nodes, since the "
+               "XSLT-variable: There must be no child nodes, since the "
                "attribute 'select' was specified.\n");
            style->errors++;
        }
+#else
+        for (cur = inst->children; cur != NULL; cur = cur->next) {
+            if (cur->type != XML_COMMENT_NODE &&
+                (cur->type != XML_TEXT_NODE || !xsltIsBlank(cur->content)))
+            {
+                xsltTransformError(NULL, style, inst,
+                    "XSLT-variable: There must be no child nodes, since the "
+                    "attribute 'select' was specified.\n");
+                style->errors++;
+            }
+        }
+#endif
     }
 }
 
-- 
1.7.2.3

>From 8be93155f91a0ce4575bfa832994fdf4229ae27d Mon Sep 17 00:00:00 2001
From: Nick Wellnhofer <[email protected]>
Date: Wed, 10 Feb 2010 02:35:09 +0100
Subject: [PATCH 6/8] Fix some warnings in the refactored code

---
 libxslt/namespaces.c |    2 +-
 libxslt/variables.c  |    9 +++++++++
 2 files changed, 10 insertions(+), 1 deletions(-)

diff --git a/libxslt/namespaces.c b/libxslt/namespaces.c
index 3e3891f..48cf039 100644
--- a/libxslt/namespaces.c
+++ b/libxslt/namespaces.c
@@ -585,7 +585,7 @@ declare_new_prefix:
        int counter = 1;
 
        if (nsPrefix == NULL) {
-           nsPrefix = "ns";
+           nsPrefix = BAD_CAST "ns";
        }
 
        do {
diff --git a/libxslt/variables.c b/libxslt/variables.c
index 43a6156..cb0d4b0 100644
--- a/libxslt/variables.c
+++ b/libxslt/variables.c
@@ -675,6 +675,9 @@ xsltStackLookup(xsltTransformContextPtr ctxt, const xmlChar 
*name,
     return(NULL);
 }
 
+#ifdef XSLT_REFACTORED
+#else
+
 /**
  * xsltCheckStackElem:
  * @ctxt:  xn XSLT transformation context
@@ -710,6 +713,8 @@ xsltCheckStackElem(xsltTransformContextPtr ctxt, const 
xmlChar *name,
     return(1);
 }
 
+#endif /* XSLT_REFACTORED */
+
 /**
  * xsltAddStackElem:
  * @ctxt:  xn XSLT transformation context
@@ -1045,7 +1050,11 @@ xsltEvalGlobalVariable(xsltStackElemPtr elem, 
xsltTransformContextPtr ctxt)
 #endif
 
     oldInst = ctxt->inst;
+#ifdef XSLT_REFACTORED
+    comp = (xsltStyleBasicItemVariablePtr) elem->comp;
+#else
     comp = elem->comp;
+#endif
     oldVarName = elem->name;
     elem->name = xsltComputingGlobalVarMarker;
     /*
-- 
1.7.2.3

>From 47857dc971b83df70aba821787da6c75b57f3162 Mon Sep 17 00:00:00 2001
From: Nick Wellnhofer <[email protected]>
Date: Sun, 25 Apr 2010 23:26:20 +0200
Subject: [PATCH 7/8] Precompile patterns in xsl:number

---
 libxslt/numbers.c          |   55 ++++++++++++-------------------------------
 libxslt/numbersInternals.h |    6 +++-
 libxslt/preproc.c          |   20 ++++++++++++---
 3 files changed, 36 insertions(+), 45 deletions(-)

diff --git a/libxslt/numbers.c b/libxslt/numbers.c
index 8683ca8..90e536b 100644
--- a/libxslt/numbers.c
+++ b/libxslt/numbers.c
@@ -534,8 +534,8 @@ xsltNumberFormatInsertNumbers(xsltNumberDataPtr data,
 static int
 xsltNumberFormatGetAnyLevel(xsltTransformContextPtr context,
                            xmlNodePtr node,
-                           const xmlChar *count,
-                           const xmlChar *from,
+                           xsltCompMatchPtr countPat,
+                           xsltCompMatchPtr fromPat,
                            double *array,
                            xmlDocPtr doc,
                            xmlNodePtr elem)
@@ -543,14 +543,7 @@ xsltNumberFormatGetAnyLevel(xsltTransformContextPtr 
context,
     int amount = 0;
     int cnt = 0;
     xmlNodePtr cur;
-    xsltCompMatchPtr countPat = NULL;
-    xsltCompMatchPtr fromPat = NULL;
 
-    if (count != NULL)
-       countPat = xsltCompilePattern(count, doc, elem, NULL, context);
-    if (from != NULL)
-       fromPat = xsltCompilePattern(from, doc, elem, NULL, context);
-       
     /* select the starting node */
     switch (node->type) {
        case XML_ELEMENT_NODE:
@@ -571,7 +564,7 @@ xsltNumberFormatGetAnyLevel(xsltTransformContextPtr context,
 
     while (cur != NULL) {
        /* process current node */
-       if (count == NULL) {
+       if (countPat == NULL) {
            if ((node->type == cur->type) &&
                /* FIXME: must use expanded-name instead of local name */
                xmlStrEqual(node->name, cur->name)) {
@@ -586,7 +579,7 @@ xsltNumberFormatGetAnyLevel(xsltTransformContextPtr context,
            if (xsltTestCompMatchList(context, cur, countPat))
                cnt++;
        }
-       if ((from != NULL) &&
+       if ((fromPat != NULL) &&
            xsltTestCompMatchList(context, cur, fromPat)) {
            break; /* while */
        }
@@ -613,18 +606,14 @@ xsltNumberFormatGetAnyLevel(xsltTransformContextPtr 
context,
 
     array[amount++] = (double) cnt;
 
-    if (countPat != NULL)
-       xsltFreeCompMatchList(countPat);
-    if (fromPat != NULL)
-       xsltFreeCompMatchList(fromPat);
     return(amount);
 }
 
 static int
 xsltNumberFormatGetMultipleLevel(xsltTransformContextPtr context,
                                 xmlNodePtr node,
-                                const xmlChar *count,
-                                const xmlChar *from,
+                                xsltCompMatchPtr countPat,
+                                xsltCompMatchPtr fromPat,
                                 double *array,
                                 int max,
                                 xmlDocPtr doc,
@@ -635,17 +624,7 @@ xsltNumberFormatGetMultipleLevel(xsltTransformContextPtr 
context,
     xmlNodePtr ancestor;
     xmlNodePtr preceding;
     xmlXPathParserContextPtr parser;
-    xsltCompMatchPtr countPat;
-    xsltCompMatchPtr fromPat;
-
-    if (count != NULL)
-       countPat = xsltCompilePattern(count, doc, elem, NULL, context);
-    else
-       countPat = NULL;
-    if (from != NULL)
-       fromPat = xsltCompilePattern(from, doc, elem, NULL, context);
-    else
-       fromPat = NULL;
+
     context->xpathCtxt->node = node;
     parser = xmlXPathNewParserContext(NULL, context->xpathCtxt);
     if (parser) {
@@ -654,11 +633,11 @@ xsltNumberFormatGetMultipleLevel(xsltTransformContextPtr 
context,
             (ancestor != NULL) && (ancestor->type != XML_DOCUMENT_NODE);
             ancestor = xmlXPathNextAncestor(parser, ancestor)) {
            
-           if ((from != NULL) &&
+           if ((fromPat != NULL) &&
                xsltTestCompMatchList(context, ancestor, fromPat))
                break; /* for */
            
-           if ((count == NULL && node->type == ancestor->type && 
+           if ((countPat == NULL && node->type == ancestor->type && 
                xmlStrEqual(node->name, ancestor->name)) ||
                xsltTestCompMatchList(context, ancestor, countPat)) {
                /* count(preceding-sibling::*) */
@@ -667,7 +646,7 @@ xsltNumberFormatGetMultipleLevel(xsltTransformContextPtr 
context,
                     preceding != NULL;
                     preceding = 
                        xmlXPathNextPrecedingSibling(parser, preceding)) {
-                   if (count == NULL) {
+                   if (countPat == NULL) {
                        if ((preceding->type == ancestor->type) &&
                            xmlStrEqual(preceding->name, ancestor->name)){
                            if ((preceding->ns == ancestor->ns) ||
@@ -690,8 +669,6 @@ xsltNumberFormatGetMultipleLevel(xsltTransformContextPtr 
context,
        }
        xmlXPathFreeParserContext(parser);
     }
-    xsltFreeCompMatchList(countPat);
-    xsltFreeCompMatchList(fromPat);
     return amount;
 }
 
@@ -779,8 +756,8 @@ xsltNumberFormat(xsltTransformContextPtr ctxt,
        if (xmlStrEqual(data->level, (const xmlChar *) "single")) {
            amount = xsltNumberFormatGetMultipleLevel(ctxt,
                                                      node,
-                                                     data->count,
-                                                     data->from,
+                                                     data->countPat,
+                                                     data->fromPat,
                                                      &number,
                                                      1,
                                                      data->doc,
@@ -797,8 +774,8 @@ xsltNumberFormat(xsltTransformContextPtr ctxt,
            int max = sizeof(numarray)/sizeof(numarray[0]);
            amount = xsltNumberFormatGetMultipleLevel(ctxt,
                                                      node,
-                                                     data->count,
-                                                     data->from,
+                                                     data->countPat,
+                                                     data->fromPat,
                                                      numarray,
                                                      max,
                                                      data->doc,
@@ -813,8 +790,8 @@ xsltNumberFormat(xsltTransformContextPtr ctxt,
        } else if (xmlStrEqual(data->level, (const xmlChar *) "any")) {
            amount = xsltNumberFormatGetAnyLevel(ctxt,
                                                 node,
-                                                data->count,
-                                                data->from,
+                                                data->countPat,
+                                                data->fromPat,
                                                 &number, 
                                                 data->doc,
                                                 data->node);
diff --git a/libxslt/numbersInternals.h b/libxslt/numbersInternals.h
index 7b3cb17..83f7d4f 100644
--- a/libxslt/numbersInternals.h
+++ b/libxslt/numbersInternals.h
@@ -17,6 +17,8 @@
 extern "C" {
 #endif
 
+struct _xsltCompMatch;
+
 /**
  * xsltNumberData:
  *
@@ -27,8 +29,6 @@ typedef xsltNumberData *xsltNumberDataPtr;
     
 struct _xsltNumberData {
     const xmlChar *level;
-    const xmlChar *count;
-    const xmlChar *from;
     const xmlChar *value;
     const xmlChar *format;
     int has_format;
@@ -37,6 +37,8 @@ struct _xsltNumberData {
     int groupingCharacterLen;
     xmlDocPtr doc;
     xmlNodePtr node;
+    struct _xsltCompMatch *countPat;
+    struct _xsltCompMatch *fromPat;
 
     /*
      * accelerators
diff --git a/libxslt/preproc.c b/libxslt/preproc.c
index 0e39343..81afa67 100644
--- a/libxslt/preproc.c
+++ b/libxslt/preproc.c
@@ -39,6 +39,7 @@
 #include "extra.h"
 #include "imports.h"
 #include "extensions.h"
+#include "pattern.h"
 
 #ifdef WITH_XSLT_DEBUG
 #define WITH_XSLT_DEBUG_PREPROC
@@ -420,6 +421,10 @@ xsltFreeStylePreComp(xsltStylePreCompPtr comp) {
            }
             break;
         case XSLT_FUNC_NUMBER:
+            if (item->numdata.countPat != NULL)
+                xsltFreeCompMatchList(item->numdata.countPat);
+            if (item->numdata.fromPat != NULL)
+                xsltFreeCompMatchList(item->numdata.fromPat);
             break;
         case XSLT_FUNC_APPLYIMPORTS:
             break;
@@ -1436,10 +1441,17 @@ xsltNumberComp(xsltStylesheetPtr style, xmlNodePtr cur) 
{
        comp->numdata.format = prop;
     }
 
-    comp->numdata.count = xsltGetCNsProp(style, cur, (const xmlChar *)"count",
-                                       XSLT_NAMESPACE);
-    comp->numdata.from = xsltGetCNsProp(style, cur, (const xmlChar *)"from",
-                                       XSLT_NAMESPACE);
+    prop = xsltGetCNsProp(style, cur, (const xmlChar *)"count", 
XSLT_NAMESPACE);
+    if (prop != NULL) {
+       comp->numdata.countPat = xsltCompilePattern(prop, cur->doc, cur, style,
+                                                    NULL);
+    }
+
+    prop = xsltGetCNsProp(style, cur, (const xmlChar *)"from", XSLT_NAMESPACE);
+    if (prop != NULL) {
+       comp->numdata.fromPat = xsltCompilePattern(prop, cur->doc, cur, style,
+                                                   NULL);
+    }
     
     prop = xsltGetCNsProp(style, cur, (const xmlChar *)"level", 
XSLT_NAMESPACE);
     if (prop != NULL) {
-- 
1.7.2.3

>From 0dea1176d6818058e28f21f7b72e818ceff52b94 Mon Sep 17 00:00:00 2001
From: Nick Wellnhofer <[email protected]>
Date: Tue, 29 Jun 2010 19:48:19 +0200
Subject: [PATCH 8/8] Fix curlies in literals for non-compiled AVTs

---
 libxslt/templates.c        |   12 +++++++++++-
 tests/REC/Makefile.am      |    1 +
 tests/REC/test-7.6.2-2.out |    2 ++
 tests/REC/test-7.6.2-2.xml |    1 +
 tests/REC/test-7.6.2-2.xsl |    6 ++++++
 5 files changed, 21 insertions(+), 1 deletions(-)
 create mode 100644 tests/REC/test-7.6.2-2.out
 create mode 100644 tests/REC/test-7.6.2-2.xml
 create mode 100644 tests/REC/test-7.6.2-2.xsl

diff --git a/libxslt/templates.c b/libxslt/templates.c
index c6250dc..52bb3cf 100644
--- a/libxslt/templates.c
+++ b/libxslt/templates.c
@@ -279,7 +279,17 @@ xsltAttrTemplateValueProcessNode(xsltTransformContextPtr 
ctxt,
            ret = xmlStrncat(ret, str, cur - str);
            str = cur;
            cur++;
-           while ((*cur != 0) && (*cur != '}')) cur++;
+           while ((*cur != 0) && (*cur != '}')) {
+               /* Need to check for literal (bug539741) */
+               if ((*cur == '\'') || (*cur == '"')) {
+                   char delim = *(cur++);
+                   while ((*cur != 0) && (*cur != delim))
+                       cur++;
+                   if (*cur != 0)
+                       cur++;  /* skip the ending delimiter */
+               } else
+                   cur++;
+            }
            if (*cur == 0) {
                xsltTransformError(ctxt, NULL, inst,
                        "xsltAttrTemplateValueProcessNode: unmatched '{'\n");
diff --git a/tests/REC/Makefile.am b/tests/REC/Makefile.am
index 9e228b5..0e299d2 100644
--- a/tests/REC/Makefile.am
+++ b/tests/REC/Makefile.am
@@ -65,6 +65,7 @@ EXTRA_DIST =                                          \
     test-7.6.1-2.out test-7.6.1-2.xml test-7.6.1-2.xsl \
     test-7.6.1-3.out test-7.6.1-3.xml test-7.6.1-3.xsl \
     test-7.6.2-1.out test-7.6.2-1.xml test-7.6.2-1.xsl \
+    test-7.6.2-2.out test-7.6.2-2.xml test-7.6.2-2.xsl \
     test-7.7-1.out test-7.7-1.xml test-7.7-1.xsl       \
     test-7.7-2.out test-7.7-2.xml test-7.7-2.xsl       \
     test-7.7-3.out test-7.7-3.xml test-7.7-3.xsl       \
diff --git a/tests/REC/test-7.6.2-2.out b/tests/REC/test-7.6.2-2.out
new file mode 100644
index 0000000..f9301e8
--- /dev/null
+++ b/tests/REC/test-7.6.2-2.out
@@ -0,0 +1,2 @@
+<?xml version="1.0"?>
+<abc/>
diff --git a/tests/REC/test-7.6.2-2.xml b/tests/REC/test-7.6.2-2.xml
new file mode 100644
index 0000000..69d62f2
--- /dev/null
+++ b/tests/REC/test-7.6.2-2.xml
@@ -0,0 +1 @@
+<doc/>
diff --git a/tests/REC/test-7.6.2-2.xsl b/tests/REC/test-7.6.2-2.xsl
new file mode 100644
index 0000000..c6f3aba
--- /dev/null
+++ b/tests/REC/test-7.6.2-2.xsl
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; version="1.0">
+    <xsl:template match="/">
+        <xsl:element name="{substring('abc}', 1, 3)}"/>
+    </xsl:template>
+</xsl:stylesheet>
-- 
1.7.2.3

_______________________________________________
xslt mailing list, project page http://xmlsoft.org/XSLT/
[email protected]
http://mail.gnome.org/mailman/listinfo/xslt

Reply via email to