Index: third_party/libxslt/libxslt/preproc.c |
diff --git a/third_party/libxslt/libxslt/preproc.c b/third_party/libxslt/libxslt/preproc.c |
index b47d8099005e5f60dc9b2e769a315412c9ba0f95..4ef3f631d98ace7eb5b3a0c864f2dbb88d9e7b4c 100644 |
--- a/third_party/libxslt/libxslt/preproc.c |
+++ b/third_party/libxslt/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 |
@@ -72,7 +73,7 @@ xsltCheckTopLevelElement(xsltStylesheetPtr style, xmlNodePtr inst, int err) { |
xmlNodePtr parent; |
if ((style == NULL) || (inst == NULL) || (inst->ns == NULL)) |
return(-1); |
- |
+ |
parent = inst->parent; |
if (parent == NULL) { |
if (err) { |
@@ -115,7 +116,7 @@ xsltCheckInstructionElement(xsltStylesheetPtr style, xmlNodePtr inst) { |
return; |
has_ext = (style->extInfos != NULL); |
- |
+ |
parent = inst->parent; |
if (parent == NULL) { |
xsltTransformError(NULL, style, inst, |
@@ -141,7 +142,7 @@ xsltCheckInstructionElement(xsltStylesheetPtr style, xmlNodePtr inst) { |
if ((has_ext) && (parent->ns != NULL) && |
(xmlHashLookup(style->extInfos, parent->ns->href) != NULL)) |
return; |
- |
+ |
parent = parent->parent; |
} |
xsltTransformError(NULL, style, inst, |
@@ -193,7 +194,7 @@ xsltCheckParentElement(xsltStylesheetPtr style, xmlNodePtr inst, |
if ((parent->ns != NULL) && |
(xmlHashLookup(style->extInfos, parent->ns->href) != NULL)) |
return; |
- |
+ |
parent = parent->parent; |
} |
} |
@@ -229,7 +230,7 @@ xsltNewStylePreComp(xsltStylesheetPtr style, xsltStyleType type) { |
if (style == NULL) |
return(NULL); |
- |
+ |
#ifdef XSLT_REFACTORED |
/* |
* URGENT TODO: Use specialized factory functions in order |
@@ -280,7 +281,7 @@ xsltNewStylePreComp(xsltStylesheetPtr style, xsltStyleType type) { |
size = sizeof(xsltStyleItemWhen); break; |
case XSLT_FUNC_OTHERWISE: |
size = sizeof(xsltStyleItemOtherwise); break; |
- default: |
+ default: |
xsltTransformError(NULL, style, NULL, |
"xsltNewStylePreComp : invalid type %d\n", type); |
style->errors++; |
@@ -353,8 +354,8 @@ xsltNewStylePreComp(xsltStylesheetPtr style, xsltStyleType type) { |
case XSLT_FUNC_DOCUMENT: |
cur->func = (xsltTransformFunction) xsltDocumentElem;break; |
case XSLT_FUNC_WITHPARAM: |
- case XSLT_FUNC_PARAM: |
- case XSLT_FUNC_VARIABLE: |
+ case XSLT_FUNC_PARAM: |
+ case XSLT_FUNC_VARIABLE: |
case XSLT_FUNC_WHEN: |
break; |
default: |
@@ -419,7 +420,13 @@ xsltFreeStylePreComp(xsltStylePreCompPtr comp) { |
xmlXPathFreeCompExpr(item->comp); |
} |
break; |
- case XSLT_FUNC_NUMBER: |
+ case XSLT_FUNC_NUMBER: { |
+ xsltStyleItemNumberPtr item = (xsltStyleItemNumberPtr) comp; |
+ if (item->numdata.countPat != NULL) |
+ xsltFreeCompMatchList(item->numdata.countPat); |
+ if (item->numdata.fromPat != NULL) |
+ xsltFreeCompMatchList(item->numdata.fromPat); |
+ } |
break; |
case XSLT_FUNC_APPLYIMPORTS: |
break; |
@@ -477,22 +484,26 @@ xsltFreeStylePreComp(xsltStylePreCompPtr comp) { |
xmlXPathFreeCompExpr(item->comp); |
} |
break; |
- case XSLT_FUNC_OTHERWISE: |
+ case XSLT_FUNC_OTHERWISE: |
case XSLT_FUNC_FALLBACK: |
case XSLT_FUNC_MESSAGE: |
case XSLT_FUNC_INCLUDE: |
case XSLT_FUNC_ATTRSET: |
- |
+ |
break; |
default: |
/* TODO: Raise error. */ |
break; |
} |
-#else |
+#else |
if (comp->locale != (xsltLocale)0) |
xsltFreeLocale(comp->locale); |
if (comp->comp != NULL) |
xmlXPathFreeCompExpr(comp->comp); |
+ if (comp->numdata.countPat != NULL) |
+ xsltFreeCompMatchList(comp->numdata.countPat); |
+ if (comp->numdata.fromPat != NULL) |
+ xsltFreeCompMatchList(comp->numdata.fromPat); |
if (comp->nsList != NULL) |
xmlFree(comp->nsList); |
#endif |
@@ -545,7 +556,7 @@ xsltDocumentComp(xsltStylesheetPtr style, xmlNodePtr inst, |
#else |
comp = xsltNewStylePreComp(style, XSLT_FUNC_DOCUMENT); |
#endif |
- |
+ |
if (comp == NULL) |
return (NULL); |
comp->inst = inst; |
@@ -592,8 +603,8 @@ xsltDocumentComp(xsltStylesheetPtr style, xmlNodePtr inst, |
#ifdef WITH_XSLT_DEBUG_EXTRA |
xsltGenericDebug(xsltGenericDebugContext, |
"Found xslt11:document construct\n"); |
-#endif |
- } else { |
+#endif |
+ } else { |
if (xmlStrEqual(inst->ns->href, |
(const xmlChar *)"http://exslt.org/common")) { |
/* EXSLT. */ |
@@ -634,12 +645,12 @@ xsltDocumentComp(xsltStylesheetPtr style, xmlNodePtr inst, |
* 3) XSLT_XT_NAMESPACE (http://www.jclark.com/xt) |
* Example: <xt:document method="xml" href="myFile.xml"> |
* TODO: is @href is an AVT? |
- * |
+ * |
* In all cases @href is in no namespace. |
*/ |
filename = xsltEvalStaticAttrValueTemplate(style, inst, |
(const xmlChar *)"href", NULL, &comp->has_filename); |
- } |
+ } |
if (!comp->has_filename) { |
goto error; |
} |
@@ -669,7 +680,7 @@ xsltSortComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
#else |
xsltStylePreCompPtr comp; |
#endif |
- if ((style == NULL) || (inst == NULL)) |
+ if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
return; |
#ifdef XSLT_REFACTORED |
@@ -677,7 +688,7 @@ xsltSortComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
#else |
comp = xsltNewStylePreComp(style, XSLT_FUNC_SORT); |
#endif |
- |
+ |
if (comp == NULL) |
return; |
inst->psvi = comp; |
@@ -777,14 +788,14 @@ xsltCopyComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
xsltStylePreCompPtr comp; |
#endif |
- if ((style == NULL) || (inst == NULL)) |
+ if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
return; |
#ifdef XSLT_REFACTORED |
comp = (xsltStyleItemCopyPtr) xsltNewStylePreComp(style, XSLT_FUNC_COPY); |
#else |
comp = xsltNewStylePreComp(style, XSLT_FUNC_COPY); |
#endif |
- |
+ |
if (comp == NULL) |
return; |
inst->psvi = comp; |
@@ -821,14 +832,14 @@ xsltTextComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
#endif |
const xmlChar *prop; |
- if ((style == NULL) || (inst == NULL)) |
+ if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
return; |
#ifdef XSLT_REFACTORED |
comp = (xsltStyleItemTextPtr) xsltNewStylePreComp(style, XSLT_FUNC_TEXT); |
#else |
comp = xsltNewStylePreComp(style, XSLT_FUNC_TEXT); |
-#endif |
+#endif |
if (comp == NULL) |
return; |
inst->psvi = comp; |
@@ -874,7 +885,7 @@ xsltElementComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
* <!-- Content: template --> |
* </xsl:element> |
*/ |
- if ((style == NULL) || (inst == NULL)) |
+ if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
return; |
#ifdef XSLT_REFACTORED |
@@ -910,8 +921,8 @@ xsltElementComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
*/ |
comp->ns = xsltEvalStaticAttrValueTemplate(style, inst, |
(const xmlChar *)"namespace", NULL, &comp->has_ns); |
- |
- if (comp->name != NULL) { |
+ |
+ if (comp->name != NULL) { |
if (xmlValidateQName(comp->name, 0)) { |
xsltTransformError(NULL, style, inst, |
"xsl:element: The value '%s' of the attribute 'name' is " |
@@ -921,7 +932,7 @@ xsltElementComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
const xmlChar *prefix = NULL, *name; |
name = xsltSplitQName(style->dict, comp->name, &prefix); |
- if (comp->has_ns == 0) { |
+ if (comp->has_ns == 0) { |
xmlNsPtr ns; |
/* |
@@ -930,7 +941,7 @@ xsltElementComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
* expanded into an expanded-name using the namespace declarations |
* in effect for the xsl:element element, including any default |
* namespace declaration. |
- */ |
+ */ |
ns = xmlSearchNs(inst->doc, inst, prefix); |
if (ns != NULL) { |
comp->ns = xmlDictLookup(style->dict, ns->href, -1); |
@@ -947,17 +958,17 @@ xsltElementComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
"not specified by the instruction itself.\n", comp->name); |
style->errors++; |
} |
- } |
+ } |
if ((prefix != NULL) && |
(!xmlStrncasecmp(prefix, (xmlChar *)"xml", 3))) |
{ |
/* |
* Mark is to be skipped. |
*/ |
- comp->has_name = 0; |
+ comp->has_name = 0; |
} |
} |
- } |
+ } |
/* |
* Attribute "use-attribute-sets", |
*/ |
@@ -965,7 +976,7 @@ xsltElementComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
(const xmlChar *)"use-attribute-sets", |
NULL, &comp->has_use); |
-error: |
+error: |
return; |
} |
@@ -991,7 +1002,7 @@ xsltAttributeComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
* <!-- Content: template --> |
* </xsl:attribute> |
*/ |
- if ((style == NULL) || (inst == NULL)) |
+ if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
return; |
#ifdef XSLT_REFACTORED |
@@ -1000,7 +1011,7 @@ xsltAttributeComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
#else |
comp = xsltNewStylePreComp(style, XSLT_FUNC_ATTRIBUTE); |
#endif |
- |
+ |
if (comp == NULL) |
return; |
inst->psvi = comp; |
@@ -1020,7 +1031,7 @@ xsltAttributeComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
"XSLT-attribute: The attribute 'name' is missing.\n"); |
style->errors++; |
return; |
- } |
+ } |
/* |
* Attribute "namespace". |
*/ |
@@ -1037,6 +1048,10 @@ xsltAttributeComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
"xsl:attribute: The value '%s' of the attribute 'name' is " |
"not a valid QName.\n", comp->name); |
style->errors++; |
+ } else if (xmlStrEqual(comp->name, BAD_CAST "xmlns")) { |
+ xsltTransformError(NULL, style, inst, |
+ "xsl:attribute: The attribute name 'xmlns' is not allowed.\n"); |
+ style->errors++; |
} else { |
const xmlChar *prefix = NULL, *name; |
@@ -1051,7 +1066,7 @@ xsltAttributeComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
* QName is expanded into an expanded-name using the |
* namespace declarations in effect for the xsl:element |
* element, including any default namespace declaration. |
- */ |
+ */ |
ns = xmlSearchNs(inst->doc, inst, prefix); |
if (ns != NULL) { |
comp->ns = xmlDictLookup(style->dict, ns->href, -1); |
@@ -1070,29 +1085,8 @@ xsltAttributeComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
style->errors++; |
} |
} |
- if (!xmlStrncasecmp(prefix, (xmlChar *) "xmlns", 5)) { |
- /* |
- * SPEC XSLT 1.0: |
- * "It is an error if the string that results from |
- * instantiating the attribute value template is not a |
- * QName or is the string xmlns. An XSLT processor may |
- * signal the error; if it does not signal the error, |
- * it must recover by not adding the attribute to the |
- * result tree." |
- * |
- * Reject a prefix of "xmlns". Mark to be skipped. |
- */ |
- comp->has_name = 0; |
- |
-#ifdef WITH_XSLT_DEBUG_PARSING |
- xsltGenericDebug(xsltGenericDebugContext, |
- "xsltAttribute: xmlns prefix forbidden\n"); |
-#endif |
- return; |
- } |
- |
} |
- } |
+ } |
} |
} |
@@ -1111,7 +1105,7 @@ xsltCommentComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
xsltStylePreCompPtr comp; |
#endif |
- if ((style == NULL) || (inst == NULL)) |
+ if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
return; |
#ifdef XSLT_REFACTORED |
@@ -1141,7 +1135,7 @@ xsltProcessingInstructionComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
xsltStylePreCompPtr comp; |
#endif |
- if ((style == NULL) || (inst == NULL)) |
+ if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
return; |
#ifdef XSLT_REFACTORED |
@@ -1175,7 +1169,7 @@ xsltCopyOfComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
xsltStylePreCompPtr comp; |
#endif |
- if ((style == NULL) || (inst == NULL)) |
+ if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
return; |
#ifdef XSLT_REFACTORED |
@@ -1222,7 +1216,7 @@ xsltValueOfComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
#endif |
const xmlChar *prop; |
- if ((style == NULL) || (inst == NULL)) |
+ if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
return; |
#ifdef XSLT_REFACTORED |
@@ -1347,7 +1341,7 @@ xsltWithParamComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
xsltStylePreCompPtr comp; |
#endif |
- if ((style == NULL) || (inst == NULL)) |
+ if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
return; |
#ifdef XSLT_REFACTORED |
@@ -1406,7 +1400,7 @@ xsltNumberComp(xsltStylesheetPtr style, xmlNodePtr cur) { |
#endif |
const xmlChar *prop; |
- if ((style == NULL) || (cur == NULL)) |
+ if ((style == NULL) || (cur == NULL) || (cur->type != XML_ELEMENT_NODE)) |
return; |
#ifdef XSLT_REFACTORED |
@@ -1426,7 +1420,7 @@ xsltNumberComp(xsltStylesheetPtr style, xmlNodePtr cur) { |
comp->numdata.node = cur; |
comp->numdata.value = xsltGetCNsProp(style, cur, (const xmlChar *)"value", |
XSLT_NAMESPACE); |
- |
+ |
prop = xsltEvalStaticAttrValueTemplate(style, cur, |
(const xmlChar *)"format", |
XSLT_NAMESPACE, &comp->numdata.has_format); |
@@ -1437,10 +1431,22 @@ xsltNumberComp(xsltStylesheetPtr style, xmlNodePtr cur) { |
} |
comp->numdata.count = xsltGetCNsProp(style, cur, (const xmlChar *)"count", |
- XSLT_NAMESPACE); |
+ XSLT_NAMESPACE); |
comp->numdata.from = xsltGetCNsProp(style, cur, (const xmlChar *)"from", |
- XSLT_NAMESPACE); |
- |
+ 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) { |
if (xmlStrEqual(prop, BAD_CAST("single")) || |
@@ -1453,14 +1459,14 @@ xsltNumberComp(xsltStylesheetPtr style, xmlNodePtr cur) { |
if (style != NULL) style->warnings++; |
} |
} |
- |
+ |
prop = xsltGetCNsProp(style, cur, (const xmlChar *)"lang", XSLT_NAMESPACE); |
if (prop != NULL) { |
xsltTransformError(NULL, style, cur, |
"xsl:number : lang attribute not implemented\n"); |
XSLT_TODO; /* xsl:number lang attribute */ |
} |
- |
+ |
prop = xsltGetCNsProp(style, cur, (const xmlChar *)"letter-value", XSLT_NAMESPACE); |
if (prop != NULL) { |
if (xmlStrEqual(prop, BAD_CAST("alphabetic"))) { |
@@ -1479,7 +1485,7 @@ xsltNumberComp(xsltStylesheetPtr style, xmlNodePtr cur) { |
if (style != NULL) style->warnings++; |
} |
} |
- |
+ |
prop = xsltGetCNsProp(style, cur, (const xmlChar *)"grouping-separator", |
XSLT_NAMESPACE); |
if (prop != NULL) { |
@@ -1487,7 +1493,7 @@ xsltNumberComp(xsltStylesheetPtr style, xmlNodePtr cur) { |
comp->numdata.groupingCharacter = |
xsltGetUTF8Char(prop, &(comp->numdata.groupingCharacterLen)); |
} |
- |
+ |
prop = xsltGetCNsProp(style, cur, (const xmlChar *)"grouping-size", XSLT_NAMESPACE); |
if (prop != NULL) { |
sscanf((char *)prop, "%d", &comp->numdata.digitsPerGroup); |
@@ -1502,7 +1508,7 @@ xsltNumberComp(xsltStylesheetPtr style, xmlNodePtr cur) { |
BAD_CAST"single", 6); |
} |
} |
- |
+ |
} |
/** |
@@ -1520,7 +1526,7 @@ xsltApplyImportsComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
xsltStylePreCompPtr comp; |
#endif |
- if ((style == NULL) || (inst == NULL)) |
+ if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
return; |
#ifdef XSLT_REFACTORED |
@@ -1550,7 +1556,7 @@ xsltCallTemplateComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
xsltStylePreCompPtr comp; |
#endif |
- if ((style == NULL) || (inst == NULL)) |
+ if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
return; |
#ifdef XSLT_REFACTORED |
@@ -1589,7 +1595,7 @@ xsltApplyTemplatesComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
xsltStylePreCompPtr comp; |
#endif |
- if ((style == NULL) || (inst == NULL)) |
+ if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
return; |
#ifdef XSLT_REFACTORED |
@@ -1641,7 +1647,7 @@ xsltChooseComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
xsltStylePreCompPtr comp; |
#endif |
- if ((style == NULL) || (inst == NULL)) |
+ if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
return; |
#ifdef XSLT_REFACTORED |
@@ -1672,7 +1678,7 @@ xsltIfComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
xsltStylePreCompPtr comp; |
#endif |
- if ((style == NULL) || (inst == NULL)) |
+ if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
return; |
#ifdef XSLT_REFACTORED |
@@ -1718,7 +1724,7 @@ xsltWhenComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
xsltStylePreCompPtr comp; |
#endif |
- if ((style == NULL) || (inst == NULL)) |
+ if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
return; |
#ifdef XSLT_REFACTORED |
@@ -1764,7 +1770,7 @@ xsltForEachComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
xsltStylePreCompPtr comp; |
#endif |
- if ((style == NULL) || (inst == NULL)) |
+ if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
return; |
#ifdef XSLT_REFACTORED |
@@ -1812,7 +1818,7 @@ xsltVariableComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
xsltStylePreCompPtr comp; |
#endif |
- if ((style == NULL) || (inst == NULL)) |
+ if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
return; |
#ifdef XSLT_REFACTORED |
@@ -1837,13 +1843,16 @@ xsltVariableComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
xsltGetQNameProperty(style, inst, BAD_CAST "name", |
1, &(comp->has_name), &(comp->ns), &(comp->name)); |
if (comp->ns) |
- comp->has_ns = 1; |
+ comp->has_ns = 1; |
/* |
* Attribute "select". |
*/ |
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 +1860,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 |
} |
} |
@@ -1875,7 +1897,7 @@ xsltParamComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
xsltStylePreCompPtr comp; |
#endif |
- if ((style == NULL) || (inst == NULL)) |
+ if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
return; |
#ifdef XSLT_REFACTORED |
@@ -1936,11 +1958,11 @@ xsltFreeStylePreComps(xsltStylesheetPtr style) { |
xsltElemPreCompPtr cur, next; |
if (style == NULL) |
- return; |
- |
+ return; |
+ |
cur = style->preComps; |
while (cur != NULL) { |
- next = cur->next; |
+ next = cur->next; |
if (cur->type == XSLT_FUNC_EXTENSION) |
cur->free(cur); |
else |
@@ -1962,12 +1984,12 @@ xsltFreeStylePreComps(xsltStylesheetPtr style) { |
*/ |
void |
xsltStylePreCompute(xsltStylesheetPtr style, xmlNodePtr node) { |
- /* |
+ /* |
* The xsltXSLTElemMarker marker was set beforehand by |
* the parsing mechanism for all elements in the XSLT namespace. |
*/ |
if (style == NULL) { |
- if (node != NULL) |
+ if ((node != NULL) && (node->type == XML_ELEMENT_NODE)) |
node->psvi = NULL; |
return; |
} |
@@ -1982,67 +2004,67 @@ xsltStylePreCompute(xsltStylesheetPtr style, xmlNodePtr node) { |
case XSLT_FUNC_APPLYTEMPLATES: |
xsltApplyTemplatesComp(style, node); |
break; |
- case XSLT_FUNC_WITHPARAM: |
+ case XSLT_FUNC_WITHPARAM: |
xsltWithParamComp(style, node); |
break; |
- case XSLT_FUNC_VALUEOF: |
+ case XSLT_FUNC_VALUEOF: |
xsltValueOfComp(style, node); |
break; |
- case XSLT_FUNC_COPY: |
+ case XSLT_FUNC_COPY: |
xsltCopyComp(style, node); |
break; |
case XSLT_FUNC_COPYOF: |
xsltCopyOfComp(style, node); |
break; |
- case XSLT_FUNC_IF: |
+ case XSLT_FUNC_IF: |
xsltIfComp(style, node); |
break; |
- case XSLT_FUNC_CHOOSE: |
+ case XSLT_FUNC_CHOOSE: |
xsltChooseComp(style, node); |
break; |
- case XSLT_FUNC_WHEN: |
+ case XSLT_FUNC_WHEN: |
xsltWhenComp(style, node); |
break; |
- case XSLT_FUNC_OTHERWISE: |
+ case XSLT_FUNC_OTHERWISE: |
/* NOP yet */ |
return; |
- case XSLT_FUNC_FOREACH: |
+ case XSLT_FUNC_FOREACH: |
xsltForEachComp(style, node); |
break; |
- case XSLT_FUNC_APPLYIMPORTS: |
+ case XSLT_FUNC_APPLYIMPORTS: |
xsltApplyImportsComp(style, node); |
break; |
- case XSLT_FUNC_ATTRIBUTE: |
+ case XSLT_FUNC_ATTRIBUTE: |
xsltAttributeComp(style, node); |
break; |
- case XSLT_FUNC_ELEMENT: |
+ case XSLT_FUNC_ELEMENT: |
xsltElementComp(style, node); |
break; |
- case XSLT_FUNC_SORT: |
+ case XSLT_FUNC_SORT: |
xsltSortComp(style, node); |
break; |
- case XSLT_FUNC_COMMENT: |
+ case XSLT_FUNC_COMMENT: |
xsltCommentComp(style, node); |
break; |
- case XSLT_FUNC_NUMBER: |
+ case XSLT_FUNC_NUMBER: |
xsltNumberComp(style, node); |
break; |
- case XSLT_FUNC_PI: |
+ case XSLT_FUNC_PI: |
xsltProcessingInstructionComp(style, node); |
break; |
- case XSLT_FUNC_CALLTEMPLATE: |
+ case XSLT_FUNC_CALLTEMPLATE: |
xsltCallTemplateComp(style, node); |
break; |
- case XSLT_FUNC_PARAM: |
+ case XSLT_FUNC_PARAM: |
xsltParamComp(style, node); |
break; |
- case XSLT_FUNC_VARIABLE: |
+ case XSLT_FUNC_VARIABLE: |
xsltVariableComp(style, node); |
break; |
- case XSLT_FUNC_FALLBACK: |
+ case XSLT_FUNC_FALLBACK: |
/* NOP yet */ |
return; |
- case XSLT_FUNC_DOCUMENT: |
+ case XSLT_FUNC_DOCUMENT: |
/* The extra one */ |
node->psvi = (void *) xsltDocumentComp(style, node, |
(xsltTransformFunction) xsltDocumentElem); |
@@ -2065,7 +2087,7 @@ xsltStylePreCompute(xsltStylesheetPtr style, xmlNodePtr node) { |
} else { |
/* |
* Fallback to string comparison. |
- */ |
+ */ |
if (IS_XSLT_NAME(node, "apply-templates")) { |
xsltApplyTemplatesComp(style, node); |
} else if (IS_XSLT_NAME(node, "with-param")) { |
@@ -2081,7 +2103,7 @@ xsltStylePreCompute(xsltStylesheetPtr style, xmlNodePtr node) { |
} else if (IS_XSLT_NAME(node, "choose")) { |
xsltChooseComp(style, node); |
} else if (IS_XSLT_NAME(node, "when")) { |
- xsltWhenComp(style, node); |
+ xsltWhenComp(style, node); |
} else if (IS_XSLT_NAME(node, "otherwise")) { |
/* NOP yet */ |
return; |
@@ -2113,7 +2135,7 @@ xsltStylePreCompute(xsltStylesheetPtr style, xmlNodePtr node) { |
} else if (IS_XSLT_NAME(node, "document")) { |
/* The extra one */ |
node->psvi = (void *) xsltDocumentComp(style, node, |
- (xsltTransformFunction) xsltDocumentElem); |
+ (xsltTransformFunction) xsltDocumentElem); |
} else if (IS_XSLT_NAME(node, "output")) { |
/* Top-level */ |
return; |
@@ -2122,7 +2144,7 @@ xsltStylePreCompute(xsltStylesheetPtr style, xmlNodePtr node) { |
return; |
} else if (IS_XSLT_NAME(node, "strip-space")) { |
/* Top-level */ |
- return; |
+ return; |
} else if (IS_XSLT_NAME(node, "key")) { |
/* Top-level */ |
return; |
@@ -2138,7 +2160,7 @@ xsltStylePreCompute(xsltStylesheetPtr style, xmlNodePtr node) { |
/* Top-level */ |
return; |
} else if (IS_XSLT_NAME(node, "include")) { |
- /* Top-level */ |
+ /* Top-level */ |
} else { |
/* |
* NOTE that xsl:text, xsl:template, xsl:stylesheet, |
@@ -2150,7 +2172,7 @@ xsltStylePreCompute(xsltStylesheetPtr style, xmlNodePtr node) { |
"the XSLT element '%s'.\n", node->name); |
style->errors++; |
return; |
- } |
+ } |
} |
/* |
* Assign the current list of in-scope namespaces to the |
@@ -2182,7 +2204,8 @@ xsltStylePreCompute(xsltStylesheetPtr style, xmlNodePtr inst) { |
* namespace- and local-name of the node, but can evaluate this |
* using cctxt->style->inode->category; |
*/ |
- if (inst->psvi != NULL) |
+ if ((inst == NULL) || (inst->type != XML_ELEMENT_NODE) || |
+ (inst->psvi != NULL)) |
return; |
if (IS_XSLT_ELEM(inst)) { |
@@ -2251,7 +2274,7 @@ xsltStylePreCompute(xsltStylesheetPtr style, xmlNodePtr inst) { |
} else if (IS_XSLT_NAME(inst, "call-template")) { |
xsltCheckInstructionElement(style, inst); |
xsltCallTemplateComp(style, inst); |
- } else if (IS_XSLT_NAME(inst, "param")) { |
+ } else if (IS_XSLT_NAME(inst, "param")) { |
if (xsltCheckTopLevelElement(style, inst, 0) == 0) |
xsltCheckInstructionElement(style, inst); |
xsltParamComp(style, inst); |
@@ -2319,7 +2342,7 @@ xsltStylePreCompute(xsltStylesheetPtr style, xmlNodePtr inst) { |
"xsltStylePreCompute: unknown xsl:%s\n", inst->name); |
if (style != NULL) style->warnings++; |
} |
- |
+ |
cur = (xsltStylePreCompPtr) inst->psvi; |
/* |
* A ns-list is build for every XSLT item in the |