Index: third_party/libxslt/libxslt/transform.c |
diff --git a/third_party/libxslt/libxslt/transform.c b/third_party/libxslt/libxslt/transform.c |
index 35701deabb6eb3546461223687521b5f1b928be7..8b86e2ebc0d96c81bea6a35ee113c023c0717759 100644 |
--- a/third_party/libxslt/libxslt/transform.c |
+++ b/third_party/libxslt/libxslt/transform.c |
@@ -338,6 +338,104 @@ profCallgraphAdd(xsltTemplatePtr templ, xsltTemplatePtr parent) |
} |
} |
+/** |
+ * xsltPreCompEval: |
+ * @ctxt: transform context |
+ * @node: context node |
+ * @comp: precompiled expression |
+ * |
+ * Evaluate a precompiled XPath expression. |
+ */ |
+static xmlXPathObjectPtr |
+xsltPreCompEval(xsltTransformContextPtr ctxt, xmlNodePtr node, |
+ xsltStylePreCompPtr comp) { |
+ xmlXPathObjectPtr res; |
+ xmlXPathContextPtr xpctxt; |
+ xmlNodePtr oldXPContextNode; |
+ xmlNsPtr *oldXPNamespaces; |
+ int oldXPProximityPosition, oldXPContextSize, oldXPNsNr; |
+ |
+ xpctxt = ctxt->xpathCtxt; |
+ oldXPContextNode = xpctxt->node; |
+ oldXPProximityPosition = xpctxt->proximityPosition; |
+ oldXPContextSize = xpctxt->contextSize; |
+ oldXPNsNr = xpctxt->nsNr; |
+ oldXPNamespaces = xpctxt->namespaces; |
+ |
+ xpctxt->node = node; |
+#ifdef XSLT_REFACTORED |
+ if (comp->inScopeNs != NULL) { |
+ xpctxt->namespaces = comp->inScopeNs->list; |
+ xpctxt->nsNr = comp->inScopeNs->xpathNumber; |
+ } else { |
+ xpctxt->namespaces = NULL; |
+ xpctxt->nsNr = 0; |
+ } |
+#else |
+ xpctxt->namespaces = comp->nsList; |
+ xpctxt->nsNr = comp->nsNr; |
+#endif |
+ |
+ res = xmlXPathCompiledEval(comp->comp, xpctxt); |
+ |
+ xpctxt->node = oldXPContextNode; |
+ xpctxt->proximityPosition = oldXPProximityPosition; |
+ xpctxt->contextSize = oldXPContextSize; |
+ xpctxt->nsNr = oldXPNsNr; |
+ xpctxt->namespaces = oldXPNamespaces; |
+ |
+ return(res); |
+} |
+ |
+/** |
+ * xsltPreCompEvalToBoolean: |
+ * @ctxt: transform context |
+ * @node: context node |
+ * @comp: precompiled expression |
+ * |
+ * Evaluate a precompiled XPath expression as boolean. |
+ */ |
+static int |
+xsltPreCompEvalToBoolean(xsltTransformContextPtr ctxt, xmlNodePtr node, |
+ xsltStylePreCompPtr comp) { |
+ int res; |
+ xmlXPathContextPtr xpctxt; |
+ xmlNodePtr oldXPContextNode; |
+ xmlNsPtr *oldXPNamespaces; |
+ int oldXPProximityPosition, oldXPContextSize, oldXPNsNr; |
+ |
+ xpctxt = ctxt->xpathCtxt; |
+ oldXPContextNode = xpctxt->node; |
+ oldXPProximityPosition = xpctxt->proximityPosition; |
+ oldXPContextSize = xpctxt->contextSize; |
+ oldXPNsNr = xpctxt->nsNr; |
+ oldXPNamespaces = xpctxt->namespaces; |
+ |
+ xpctxt->node = node; |
+#ifdef XSLT_REFACTORED |
+ if (comp->inScopeNs != NULL) { |
+ xpctxt->namespaces = comp->inScopeNs->list; |
+ xpctxt->nsNr = comp->inScopeNs->xpathNumber; |
+ } else { |
+ xpctxt->namespaces = NULL; |
+ xpctxt->nsNr = 0; |
+ } |
+#else |
+ xpctxt->namespaces = comp->nsList; |
+ xpctxt->nsNr = comp->nsNr; |
+#endif |
+ |
+ res = xmlXPathCompiledEvalToBoolean(comp->comp, xpctxt); |
+ |
+ xpctxt->node = oldXPContextNode; |
+ xpctxt->proximityPosition = oldXPProximityPosition; |
+ xpctxt->contextSize = oldXPContextSize; |
+ xpctxt->nsNr = oldXPNsNr; |
+ xpctxt->namespaces = oldXPNamespaces; |
+ |
+ return(res); |
+} |
+ |
/************************************************************************ |
* * |
* XInclude default settings * |
@@ -831,9 +929,9 @@ xsltCopyTextString(xsltTransformContextPtr ctxt, xmlNodePtr target, |
} |
copy = xmlNewTextLen(string, len); |
} |
+ if (copy != NULL && target != NULL) |
+ copy = xsltAddChild(target, copy); |
if (copy != NULL) { |
- if (target != NULL) |
- copy = xsltAddChild(target, copy); |
ctxt->lasttext = copy->content; |
ctxt->lasttsize = len; |
ctxt->lasttuse = len; |
@@ -1222,6 +1320,11 @@ xsltShallowCopyElem(xsltTransformContextPtr ctxt, xmlNodePtr node, |
if (copy != NULL) { |
copy->doc = ctxt->output; |
copy = xsltAddChild(insert, copy); |
+ if (copy == NULL) { |
+ xsltTransformError(ctxt, NULL, node, |
+ "xsltShallowCopyElem: copy failed\n"); |
+ return (copy); |
+ } |
if (node->type == XML_ELEMENT_NODE) { |
/* |
@@ -1555,6 +1658,11 @@ xsltCopyTreeInternal(xsltTransformContextPtr ctxt, |
if (copy != NULL) { |
copy->doc = ctxt->output; |
copy = xsltAddChild(insert, copy); |
+ if (copy == NULL) { |
+ xsltTransformError(ctxt, NULL, invocNode, |
+ "xsltCopyTreeInternal: Copying of '%s' failed.\n", node->name); |
+ return (copy); |
+ } |
/* |
* The node may have been coalesced into another text node. |
*/ |
@@ -3606,8 +3714,7 @@ xsltDocumentElem(xsltTransformContextPtr ctxt, xmlNodePtr node, |
xmlDictReference(res->dict); |
} else if (xmlStrEqual(method, (const xmlChar *) "xhtml")) { |
xsltTransformError(ctxt, NULL, inst, |
- "xsltDocumentElem: unsupported method xhtml\n", |
- style->method); |
+ "xsltDocumentElem: unsupported method xhtml\n"); |
ctxt->type = XSLT_OUTPUT_HTML; |
res = htmlNewDocNoDtD(doctypeSystem, doctypePublic); |
if (res == NULL) |
@@ -3627,8 +3734,8 @@ xsltDocumentElem(xsltTransformContextPtr ctxt, xmlNodePtr node, |
#endif |
} else { |
xsltTransformError(ctxt, NULL, inst, |
- "xsltDocumentElem: unsupported method %s\n", |
- style->method); |
+ "xsltDocumentElem: unsupported method (%s)\n", |
+ method); |
goto error; |
} |
} else { |
@@ -4034,6 +4141,11 @@ xsltElement(xsltTransformContextPtr ctxt, xmlNodePtr node, |
return; |
} |
copy = xsltAddChild(ctxt->insert, copy); |
+ if (copy == NULL) { |
+ xsltTransformError(ctxt, NULL, inst, |
+ "xsl:element : xsltAddChild failed\n"); |
+ return; |
+ } |
/* |
* Namespace |
@@ -4287,11 +4399,6 @@ xsltCopyOf(xsltTransformContextPtr ctxt, xmlNodePtr node, |
xmlXPathObjectPtr res = NULL; |
xmlNodeSetPtr list = NULL; |
int i; |
- xmlDocPtr oldXPContextDoc; |
- xmlNsPtr *oldXPNamespaces; |
- xmlNodePtr oldXPContextNode; |
- int oldXPProximityPosition, oldXPContextSize, oldXPNsNr; |
- xmlXPathContextPtr xpctxt; |
if ((ctxt == NULL) || (node == NULL) || (inst == NULL)) |
return; |
@@ -4327,42 +4434,7 @@ xsltCopyOf(xsltTransformContextPtr ctxt, xmlNodePtr node, |
/* |
* Evaluate the "select" expression. |
*/ |
- xpctxt = ctxt->xpathCtxt; |
- oldXPContextDoc = xpctxt->doc; |
- oldXPContextNode = xpctxt->node; |
- oldXPProximityPosition = xpctxt->proximityPosition; |
- oldXPContextSize = xpctxt->contextSize; |
- oldXPNsNr = xpctxt->nsNr; |
- oldXPNamespaces = xpctxt->namespaces; |
- |
- xpctxt->node = node; |
- if (comp != NULL) { |
- |
-#ifdef XSLT_REFACTORED |
- if (comp->inScopeNs != NULL) { |
- xpctxt->namespaces = comp->inScopeNs->list; |
- xpctxt->nsNr = comp->inScopeNs->xpathNumber; |
- } else { |
- xpctxt->namespaces = NULL; |
- xpctxt->nsNr = 0; |
- } |
-#else |
- xpctxt->namespaces = comp->nsList; |
- xpctxt->nsNr = comp->nsNr; |
-#endif |
- } else { |
- xpctxt->namespaces = NULL; |
- xpctxt->nsNr = 0; |
- } |
- |
- res = xmlXPathCompiledEval(comp->comp, xpctxt); |
- |
- xpctxt->doc = oldXPContextDoc; |
- xpctxt->node = oldXPContextNode; |
- xpctxt->contextSize = oldXPContextSize; |
- xpctxt->proximityPosition = oldXPProximityPosition; |
- xpctxt->nsNr = oldXPNsNr; |
- xpctxt->namespaces = oldXPNamespaces; |
+ res = xsltPreCompEval(ctxt, node, comp); |
if (res != NULL) { |
if (res->type == XPATH_NODESET) { |
@@ -4472,11 +4544,6 @@ xsltValueOf(xsltTransformContextPtr ctxt, xmlNodePtr node, |
#endif |
xmlXPathObjectPtr res = NULL; |
xmlChar *value = NULL; |
- xmlDocPtr oldXPContextDoc; |
- xmlNsPtr *oldXPNamespaces; |
- xmlNodePtr oldXPContextNode; |
- int oldXPProximityPosition, oldXPContextSize, oldXPNsNr; |
- xmlXPathContextPtr xpctxt; |
if ((ctxt == NULL) || (node == NULL) || (inst == NULL)) |
return; |
@@ -4493,42 +4560,7 @@ xsltValueOf(xsltTransformContextPtr ctxt, xmlNodePtr node, |
"xsltValueOf: select %s\n", comp->select)); |
#endif |
- xpctxt = ctxt->xpathCtxt; |
- oldXPContextDoc = xpctxt->doc; |
- oldXPContextNode = xpctxt->node; |
- oldXPProximityPosition = xpctxt->proximityPosition; |
- oldXPContextSize = xpctxt->contextSize; |
- oldXPNsNr = xpctxt->nsNr; |
- oldXPNamespaces = xpctxt->namespaces; |
- |
- xpctxt->node = node; |
- if (comp != NULL) { |
- |
-#ifdef XSLT_REFACTORED |
- if (comp->inScopeNs != NULL) { |
- xpctxt->namespaces = comp->inScopeNs->list; |
- xpctxt->nsNr = comp->inScopeNs->xpathNumber; |
- } else { |
- xpctxt->namespaces = NULL; |
- xpctxt->nsNr = 0; |
- } |
-#else |
- xpctxt->namespaces = comp->nsList; |
- xpctxt->nsNr = comp->nsNr; |
-#endif |
- } else { |
- xpctxt->namespaces = NULL; |
- xpctxt->nsNr = 0; |
- } |
- |
- res = xmlXPathCompiledEval(comp->comp, xpctxt); |
- |
- xpctxt->doc = oldXPContextDoc; |
- xpctxt->node = oldXPContextNode; |
- xpctxt->contextSize = oldXPContextSize; |
- xpctxt->proximityPosition = oldXPProximityPosition; |
- xpctxt->nsNr = oldXPNsNr; |
- xpctxt->namespaces = oldXPNamespaces; |
+ res = xsltPreCompEval(ctxt, node, comp); |
/* |
* Cast the XPath object to string. |
@@ -4584,6 +4616,10 @@ xsltNumber(xsltTransformContextPtr ctxt, xmlNodePtr node, |
#else |
xsltStylePreCompPtr comp = castedComp; |
#endif |
+ xmlXPathContextPtr xpctxt; |
+ xmlNsPtr *oldXPNamespaces; |
+ int oldXPNsNr; |
+ |
if (comp == NULL) { |
xsltTransformError(ctxt, NULL, inst, |
"xsl:number : compilation failed\n"); |
@@ -4596,7 +4632,27 @@ xsltNumber(xsltTransformContextPtr ctxt, xmlNodePtr node, |
comp->numdata.doc = inst->doc; |
comp->numdata.node = inst; |
+ xpctxt = ctxt->xpathCtxt; |
+ oldXPNsNr = xpctxt->nsNr; |
+ oldXPNamespaces = xpctxt->namespaces; |
+ |
+#ifdef XSLT_REFACTORED |
+ if (comp->inScopeNs != NULL) { |
+ xpctxt->namespaces = comp->inScopeNs->list; |
+ xpctxt->nsNr = comp->inScopeNs->xpathNumber; |
+ } else { |
+ xpctxt->namespaces = NULL; |
+ xpctxt->nsNr = 0; |
+ } |
+#else |
+ xpctxt->namespaces = comp->nsList; |
+ xpctxt->nsNr = comp->nsNr; |
+#endif |
+ |
xsltNumberFormat(ctxt, &comp->numdata, node); |
+ |
+ xpctxt->nsNr = oldXPNsNr; |
+ xpctxt->namespaces = oldXPNamespaces; |
} |
/** |
@@ -4790,12 +4846,11 @@ xsltApplyTemplates(xsltTransformContextPtr ctxt, xmlNodePtr node, |
xmlNodePtr cur, delNode = NULL, oldContextNode; |
xmlNodeSetPtr list = NULL, oldList; |
xsltStackElemPtr withParams = NULL; |
- int oldXPProximityPosition, oldXPContextSize, oldXPNsNr; |
+ int oldXPProximityPosition, oldXPContextSize; |
const xmlChar *oldMode, *oldModeURI; |
xmlDocPtr oldXPDoc; |
xsltDocumentPtr oldDocInfo; |
xmlXPathContextPtr xpctxt; |
- xmlNsPtr *oldXPNamespaces; |
if (comp == NULL) { |
xsltTransformError(ctxt, NULL, inst, |
@@ -4829,8 +4884,6 @@ xsltApplyTemplates(xsltTransformContextPtr ctxt, xmlNodePtr node, |
oldXPContextSize = xpctxt->contextSize; |
oldXPProximityPosition = xpctxt->proximityPosition; |
oldXPDoc = xpctxt->doc; |
- oldXPNsNr = xpctxt->nsNr; |
- oldXPNamespaces = xpctxt->namespaces; |
/* |
* Set up contexts. |
@@ -4851,26 +4904,8 @@ xsltApplyTemplates(xsltTransformContextPtr ctxt, xmlNodePtr node, |
"xsltApplyTemplates: select %s\n", comp->select)); |
#endif |
- /* |
- * Set up XPath. |
- */ |
- xpctxt->node = node; /* Set the "context node" */ |
-#ifdef XSLT_REFACTORED |
- if (comp->inScopeNs != NULL) { |
- xpctxt->namespaces = comp->inScopeNs->list; |
- xpctxt->nsNr = comp->inScopeNs->xpathNumber; |
- } else { |
- xpctxt->namespaces = NULL; |
- xpctxt->nsNr = 0; |
- } |
-#else |
- xpctxt->namespaces = comp->nsList; |
- xpctxt->nsNr = comp->nsNr; |
-#endif |
- res = xmlXPathCompiledEval(comp->comp, xpctxt); |
+ res = xsltPreCompEval(ctxt, node, comp); |
- xpctxt->contextSize = oldXPContextSize; |
- xpctxt->proximityPosition = oldXPProximityPosition; |
if (res != NULL) { |
if (res->type == XPATH_NODESET) { |
list = res->nodesetval; /* consume the node set */ |
@@ -5153,8 +5188,6 @@ error: |
/* |
* Restore context states. |
*/ |
- xpctxt->nsNr = oldXPNsNr; |
- xpctxt->namespaces = oldXPNamespaces; |
xpctxt->doc = oldXPDoc; |
xpctxt->contextSize = oldXPContextSize; |
xpctxt->proximityPosition = oldXPProximityPosition; |
@@ -5210,12 +5243,6 @@ xsltChoose(xsltTransformContextPtr ctxt, xmlNodePtr contextNode, |
{ |
int testRes = 0, res = 0; |
- xmlXPathContextPtr xpctxt = ctxt->xpathCtxt; |
- xmlDocPtr oldXPContextDoc = xpctxt->doc; |
- int oldXPProximityPosition = xpctxt->proximityPosition; |
- int oldXPContextSize = xpctxt->contextSize; |
- xmlNsPtr *oldXPNamespaces = xpctxt->namespaces; |
- int oldXPNsNr = xpctxt->nsNr; |
#ifdef XSLT_REFACTORED |
xsltStyleItemWhenPtr wcomp = NULL; |
@@ -5252,27 +5279,8 @@ xsltChoose(xsltTransformContextPtr ctxt, xmlNodePtr contextNode, |
"xsltChoose: test %s\n", wcomp->test)); |
#endif |
- xpctxt->node = contextNode; |
- xpctxt->doc = oldXPContextDoc; |
- xpctxt->proximityPosition = oldXPProximityPosition; |
- xpctxt->contextSize = oldXPContextSize; |
- |
-#ifdef XSLT_REFACTORED |
- if (wcomp->inScopeNs != NULL) { |
- xpctxt->namespaces = wcomp->inScopeNs->list; |
- xpctxt->nsNr = wcomp->inScopeNs->xpathNumber; |
- } else { |
- xpctxt->namespaces = NULL; |
- xpctxt->nsNr = 0; |
- } |
-#else |
- xpctxt->namespaces = wcomp->nsList; |
- xpctxt->nsNr = wcomp->nsNr; |
-#endif |
- |
- |
#ifdef XSLT_FAST_IF |
- res = xmlXPathCompiledEvalToBoolean(wcomp->comp, xpctxt); |
+ res = xsltPreCompEvalToBoolean(ctxt, contextNode, wcomp); |
if (res == -1) { |
ctxt->state = XSLT_STATE_STOPPED; |
@@ -5282,7 +5290,7 @@ xsltChoose(xsltTransformContextPtr ctxt, xmlNodePtr contextNode, |
#else /* XSLT_FAST_IF */ |
- res = xmlXPathCompiledEval(wcomp->comp, xpctxt); |
+ res = xsltPreCompEval(ctxt, cotextNode, wcomp); |
if (res != NULL) { |
if (res->type != XPATH_BOOLEAN) |
@@ -5331,22 +5339,10 @@ xsltChoose(xsltTransformContextPtr ctxt, xmlNodePtr contextNode, |
#endif |
goto test_is_true; |
} |
- xpctxt->node = contextNode; |
- xpctxt->doc = oldXPContextDoc; |
- xpctxt->proximityPosition = oldXPProximityPosition; |
- xpctxt->contextSize = oldXPContextSize; |
- xpctxt->namespaces = oldXPNamespaces; |
- xpctxt->nsNr = oldXPNsNr; |
goto exit; |
test_is_true: |
- xpctxt->node = contextNode; |
- xpctxt->doc = oldXPContextDoc; |
- xpctxt->proximityPosition = oldXPProximityPosition; |
- xpctxt->contextSize = oldXPContextSize; |
- xpctxt->namespaces = oldXPNamespaces; |
- xpctxt->nsNr = oldXPNsNr; |
goto process_sequence; |
} |
@@ -5400,38 +5396,9 @@ xsltIf(xsltTransformContextPtr ctxt, xmlNodePtr contextNode, |
#ifdef XSLT_FAST_IF |
{ |
- xmlXPathContextPtr xpctxt = ctxt->xpathCtxt; |
- xmlDocPtr oldXPContextDoc = xpctxt->doc; |
- xmlNsPtr *oldXPNamespaces = xpctxt->namespaces; |
- xmlNodePtr oldXPContextNode = xpctxt->node; |
- int oldXPProximityPosition = xpctxt->proximityPosition; |
- int oldXPContextSize = xpctxt->contextSize; |
- int oldXPNsNr = xpctxt->nsNr; |
xmlDocPtr oldLocalFragmentTop = ctxt->localRVT; |
- xpctxt->node = contextNode; |
- if (comp != NULL) { |
- |
-#ifdef XSLT_REFACTORED |
- if (comp->inScopeNs != NULL) { |
- xpctxt->namespaces = comp->inScopeNs->list; |
- xpctxt->nsNr = comp->inScopeNs->xpathNumber; |
- } else { |
- xpctxt->namespaces = NULL; |
- xpctxt->nsNr = 0; |
- } |
-#else |
- xpctxt->namespaces = comp->nsList; |
- xpctxt->nsNr = comp->nsNr; |
-#endif |
- } else { |
- xpctxt->namespaces = NULL; |
- xpctxt->nsNr = 0; |
- } |
- /* |
- * This XPath function is optimized for boolean results. |
- */ |
- res = xmlXPathCompiledEvalToBoolean(comp->comp, xpctxt); |
+ res = xsltPreCompEvalToBoolean(ctxt, contextNode, comp); |
/* |
* Cleanup fragments created during evaluation of the |
@@ -5439,13 +5406,6 @@ xsltIf(xsltTransformContextPtr ctxt, xmlNodePtr contextNode, |
*/ |
if (oldLocalFragmentTop != ctxt->localRVT) |
xsltReleaseLocalRVTs(ctxt, oldLocalFragmentTop); |
- |
- xpctxt->doc = oldXPContextDoc; |
- xpctxt->node = oldXPContextNode; |
- xpctxt->contextSize = oldXPContextSize; |
- xpctxt->proximityPosition = oldXPProximityPosition; |
- xpctxt->nsNr = oldXPNsNr; |
- xpctxt->namespaces = oldXPNamespaces; |
} |
#ifdef WITH_XSLT_DEBUG_PROCESS |
@@ -5467,51 +5427,10 @@ xsltIf(xsltTransformContextPtr ctxt, xmlNodePtr contextNode, |
#else /* XSLT_FAST_IF */ |
{ |
- xmlXPathObjectPtr xpobj = NULL; |
/* |
* OLD CODE: |
*/ |
- { |
- xmlXPathContextPtr xpctxt = ctxt->xpathCtxt; |
- xmlDocPtr oldXPContextDoc = xpctxt->doc; |
- xmlNsPtr *oldXPNamespaces = xpctxt->namespaces; |
- xmlNodePtr oldXPContextNode = xpctxt->node; |
- int oldXPProximityPosition = xpctxt->proximityPosition; |
- int oldXPContextSize = xpctxt->contextSize; |
- int oldXPNsNr = xpctxt->nsNr; |
- |
- xpctxt->node = contextNode; |
- if (comp != NULL) { |
- |
-#ifdef XSLT_REFACTORED |
- if (comp->inScopeNs != NULL) { |
- xpctxt->namespaces = comp->inScopeNs->list; |
- xpctxt->nsNr = comp->inScopeNs->xpathNumber; |
- } else { |
- xpctxt->namespaces = NULL; |
- xpctxt->nsNr = 0; |
- } |
-#else |
- xpctxt->namespaces = comp->nsList; |
- xpctxt->nsNr = comp->nsNr; |
-#endif |
- } else { |
- xpctxt->namespaces = NULL; |
- xpctxt->nsNr = 0; |
- } |
- |
- /* |
- * This XPath function is optimized for boolean results. |
- */ |
- xpobj = xmlXPathCompiledEval(comp->comp, xpctxt); |
- |
- xpctxt->doc = oldXPContextDoc; |
- xpctxt->node = oldXPContextNode; |
- xpctxt->contextSize = oldXPContextSize; |
- xpctxt->proximityPosition = oldXPProximityPosition; |
- xpctxt->nsNr = oldXPNsNr; |
- xpctxt->namespaces = oldXPNamespaces; |
- } |
+ xmlXPathObjectPtr xpobj = xsltPreCompEval(ctxt, contextNode, comp); |
if (xpobj != NULL) { |
if (xpobj->type != XPATH_BOOLEAN) |
xpobj = xmlXPathConvertBoolean(xpobj); |
@@ -5618,27 +5537,11 @@ xsltForEach(xsltTransformContextPtr ctxt, xmlNodePtr contextNode, |
oldXPDoc = xpctxt->doc; |
oldXPProximityPosition = xpctxt->proximityPosition; |
oldXPContextSize = xpctxt->contextSize; |
- /* |
- * Set up XPath. |
- */ |
- xpctxt->node = contextNode; |
-#ifdef XSLT_REFACTORED |
- if (comp->inScopeNs != NULL) { |
- xpctxt->namespaces = comp->inScopeNs->list; |
- xpctxt->nsNr = comp->inScopeNs->xpathNumber; |
- } else { |
- xpctxt->namespaces = NULL; |
- xpctxt->nsNr = 0; |
- } |
-#else |
- xpctxt->namespaces = comp->nsList; |
- xpctxt->nsNr = comp->nsNr; |
-#endif |
/* |
* Evaluate the 'select' expression. |
*/ |
- res = xmlXPathCompiledEval(comp->comp, ctxt->xpathCtxt); |
+ res = xsltPreCompEval(ctxt, contextNode, comp); |
if (res != NULL) { |
if (res->type == XPATH_NODESET) |
@@ -5669,13 +5572,6 @@ xsltForEach(xsltTransformContextPtr ctxt, xmlNodePtr contextNode, |
#endif |
/* |
- * Restore XPath states for the "current node". |
- */ |
- xpctxt->contextSize = oldXPContextSize; |
- xpctxt->proximityPosition = oldXPProximityPosition; |
- xpctxt->node = contextNode; |
- |
- /* |
* Set the list; this has to be done already here for xsltDoSortFunction(). |
*/ |
ctxt->nodeList = list; |
@@ -6076,8 +5972,7 @@ xsltApplyStylesheetInternal(xsltStylesheetPtr style, xmlDocPtr doc, |
#endif |
} else if (xmlStrEqual(method, (const xmlChar *) "xhtml")) { |
xsltTransformError(ctxt, NULL, (xmlNodePtr) doc, |
- "xsltApplyStylesheetInternal: unsupported method xhtml, using html\n", |
- style->method); |
+ "xsltApplyStylesheetInternal: unsupported method xhtml, using html\n"); |
ctxt->type = XSLT_OUTPUT_HTML; |
res = htmlNewDoc(doctypeSystem, doctypePublic); |
if (res == NULL) |
@@ -6103,8 +5998,8 @@ xsltApplyStylesheetInternal(xsltStylesheetPtr style, xmlDocPtr doc, |
#endif |
} else { |
xsltTransformError(ctxt, NULL, (xmlNodePtr) doc, |
- "xsltApplyStylesheetInternal: unsupported method %s\n", |
- style->method); |
+ "xsltApplyStylesheetInternal: unsupported method (%s)\n", |
+ method); |
goto error; |
} |
} else { |