| Index: third_party/libxslt/libxslt/xslt.c
|
| diff --git a/third_party/libxslt/libxslt/xslt.c b/third_party/libxslt/libxslt/xslt.c
|
| index 0ae922848460f8e41d2ad2bc46fc56fe284a6b77..58d138674e5ec705a3b0e12b50bb1495eaadebc7 100644
|
| --- a/third_party/libxslt/libxslt/xslt.c
|
| +++ b/third_party/libxslt/libxslt/xslt.c
|
| @@ -243,6 +243,10 @@ xsltInit (void) {
|
| */
|
| void
|
| xsltUninit (void) {
|
| +#ifdef XSLT_LOCALE_WINAPI
|
| + xmlFreeRMutex(xsltLocaleMutex);
|
| + xsltLocaleMutex = NULL;
|
| +#endif
|
| initialized = 0;
|
| }
|
|
|
| @@ -281,7 +285,7 @@ xsltNewDecimalFormat(xmlChar *name)
|
| if (self != NULL) {
|
| self->next = NULL;
|
| self->name = name;
|
| -
|
| +
|
| /* Default values */
|
| self->digit = xmlStrdup(BAD_CAST("#"));
|
| self->patternSeparator = xmlStrdup(BAD_CAST(";"));
|
| @@ -335,7 +339,7 @@ xsltFreeDecimalFormatList(xsltStylesheetPtr self)
|
|
|
| if (self == NULL)
|
| return;
|
| -
|
| +
|
| iter = self->decimalFormat;
|
| while (iter != NULL) {
|
| tmp = iter->next;
|
| @@ -417,6 +421,11 @@ xsltFreeTemplate(xsltTemplatePtr template) {
|
| if (template->modeURI) xmlFree(template->modeURI);
|
| */
|
| if (template->inheritedNs) xmlFree(template->inheritedNs);
|
| +
|
| + /* free profiling data */
|
| + if (template->templCalledTab) xmlFree(template->templCalledTab);
|
| + if (template->templCountTab) xmlFree(template->templCountTab);
|
| +
|
| memset(template, -1, sizeof(xsltTemplate));
|
| xmlFree(template);
|
| }
|
| @@ -444,12 +453,12 @@ static void
|
| xsltFreeNsAliasList(xsltNsAliasPtr item)
|
| {
|
| xsltNsAliasPtr tmp;
|
| -
|
| +
|
| while (item) {
|
| tmp = item;
|
| item = item->next;
|
| xmlFree(tmp);
|
| - }
|
| + }
|
| return;
|
| }
|
|
|
| @@ -458,12 +467,12 @@ static void
|
| xsltFreeNamespaceMap(xsltNsMapPtr item)
|
| {
|
| xsltNsMapPtr tmp;
|
| -
|
| +
|
| while (item) {
|
| tmp = item;
|
| item = item->next;
|
| xmlFree(tmp);
|
| - }
|
| + }
|
| return;
|
| }
|
|
|
| @@ -501,15 +510,15 @@ xsltNewNamespaceMapItem(xsltCompilerCtxtPtr cctxt,
|
| #endif /* XSLT_REFACTORED_XSLT_NSCOMP */
|
|
|
| /**
|
| - * xsltCompilerVarInfoFree:
|
| + * xsltCompilerVarInfoFree:
|
| * @cctxt: the compilation context
|
| - *
|
| + *
|
| * Frees the list of information for vars/params.
|
| */
|
| static void
|
| xsltCompilerVarInfoFree(xsltCompilerCtxtPtr cctxt)
|
| {
|
| - xsltVarInfoPtr ivar = cctxt->ivars, ivartmp;
|
| + xsltVarInfoPtr ivar = cctxt->ivars, ivartmp;
|
|
|
| while (ivar) {
|
| ivartmp = ivar;
|
| @@ -521,11 +530,11 @@ xsltCompilerVarInfoFree(xsltCompilerCtxtPtr cctxt)
|
| /**
|
| * xsltCompilerCtxtFree:
|
| *
|
| - * Free an XSLT compiler context.
|
| + * Free an XSLT compiler context.
|
| */
|
| static void
|
| xsltCompilationCtxtFree(xsltCompilerCtxtPtr cctxt)
|
| -{
|
| +{
|
| if (cctxt == NULL)
|
| return;
|
| #ifdef WITH_XSLT_DEBUG_PARSING
|
| @@ -597,7 +606,7 @@ xsltCompilationCtxtCreate(xsltStylesheetPtr style) {
|
| if (ret->xpathCtxt == NULL)
|
| goto internal_err;
|
| #endif
|
| -
|
| +
|
| return(ret);
|
|
|
| internal_err:
|
| @@ -645,11 +654,11 @@ xsltFreePrincipalStylesheetData(xsltPrincipalStylesheetDataPtr data)
|
| if (data->exclResultNamespaces != NULL) {
|
| int i;
|
| xsltPointerListPtr list = (xsltPointerListPtr)
|
| - data->exclResultNamespaces;
|
| -
|
| + data->exclResultNamespaces;
|
| +
|
| for (i = 0; i < list->number; i++)
|
| xsltPointerListFree((xsltPointerListPtr) list->items[i]);
|
| -
|
| +
|
| xsltPointerListFree(list);
|
| data->exclResultNamespaces = NULL;
|
| }
|
| @@ -688,10 +697,10 @@ xsltNewPrincipalStylesheetData(void)
|
| return(NULL);
|
| }
|
| memset(ret, 0, sizeof(xsltPrincipalStylesheetData));
|
| -
|
| +
|
| /*
|
| * Global list of in-scope namespaces.
|
| - */
|
| + */
|
| ret->inScopeNamespaces = xsltPointerListCreate(-1);
|
| if (ret->inScopeNamespaces == NULL)
|
| goto internal_err;
|
| @@ -703,7 +712,7 @@ xsltNewPrincipalStylesheetData(void)
|
| goto internal_err;
|
| /*
|
| * Global list of extension instruction namespace names.
|
| - */
|
| + */
|
| ret->extElemNamespaces = xsltPointerListCreate(-1);
|
| if (ret->extElemNamespaces == NULL)
|
| goto internal_err;
|
| @@ -726,7 +735,7 @@ internal_err:
|
| */
|
| xsltStylesheetPtr
|
| xsltNewStylesheet(void) {
|
| - xsltStylesheetPtr ret = NULL;
|
| + xsltStylesheetPtr ret = NULL;
|
|
|
| ret = (xsltStylesheetPtr) xmlMalloc(sizeof(xsltStylesheet));
|
| if (ret == NULL) {
|
| @@ -749,6 +758,7 @@ xsltNewStylesheet(void) {
|
| ret->extrasNr = 0;
|
| ret->internalized = 1;
|
| ret->literal_result = 0;
|
| + ret->forwards_compatible = 0;
|
| ret->dict = xmlDictCreate();
|
| #ifdef WITH_XSLT_DEBUG
|
| xsltGenericDebug(xsltGenericDebugContext,
|
| @@ -865,7 +875,7 @@ xsltFreeStylesheetList(xsltStylesheetPtr style) {
|
| static int
|
| xsltCleanupStylesheetTree(xmlDocPtr doc ATTRIBUTE_UNUSED,
|
| xmlNodePtr rootElem ATTRIBUTE_UNUSED)
|
| -{
|
| +{
|
| #if 0 /* TODO: Currently disabled, since probably not needed. */
|
| xmlNodePtr cur;
|
|
|
| @@ -922,7 +932,7 @@ xsltFreeStylesheet(xsltStylesheetPtr style)
|
| {
|
| if (style == NULL)
|
| return;
|
| -
|
| +
|
| #ifdef XSLT_REFACTORED
|
| /*
|
| * Start with a cleanup of the main stylesheet's doc.
|
| @@ -938,7 +948,7 @@ xsltFreeStylesheet(xsltStylesheetPtr style)
|
| XSLT_HAS_INTERNAL_NSMAP(style))
|
| {
|
| xsltRestoreDocumentNamespaces(XSLT_GET_INTERNAL_NSMAP(style),
|
| - style->doc);
|
| + style->doc);
|
| }
|
| #endif /* XSLT_REFACTORED_XSLT_NSCOMP */
|
| #else
|
| @@ -967,7 +977,7 @@ xsltFreeStylesheet(xsltStylesheetPtr style)
|
| * TODO: Best time to shutdown extension stuff?
|
| */
|
| xsltShutdownExts(style);
|
| -
|
| +
|
| if (style->variables != NULL)
|
| xsltFreeStackElemList(style->variables);
|
| if (style->cdataSection != NULL)
|
| @@ -1007,13 +1017,13 @@ xsltFreeStylesheet(xsltStylesheetPtr style)
|
| xsltFreePrincipalStylesheetData(style->principalData);
|
| style->principalData = NULL;
|
| }
|
| - }
|
| + }
|
| #endif
|
| /*
|
| * Better to free the main document of this stylesheet level
|
| * at the end - so here.
|
| */
|
| - if (style->doc != NULL) {
|
| + if (style->doc != NULL) {
|
| xmlFreeDoc(style->doc);
|
| }
|
|
|
| @@ -1044,7 +1054,7 @@ xsltFreeStylesheet(xsltStylesheetPtr style)
|
| * @template: the template
|
| * @node: the current node
|
| *
|
| - * Search all the namespace applying to a given element except the ones
|
| + * Search all the namespace applying to a given element except the ones
|
| * from excluded output prefixes currently in scope. Initialize the
|
| * template inheritedNs list with it.
|
| *
|
| @@ -1059,7 +1069,7 @@ xsltGetInheritedNsList(xsltStylesheetPtr style,
|
| xmlNsPtr *ret = NULL;
|
| int nbns = 0;
|
| int maxns = 10;
|
| - int i;
|
| + int i;
|
|
|
| if ((style == NULL) || (template == NULL) || (node == NULL) ||
|
| (template->inheritedNsNr != 0) || (template->inheritedNs != NULL))
|
| @@ -1153,9 +1163,9 @@ xsltParseStylesheetOutput(xsltStylesheetPtr style, xmlNodePtr cur)
|
| xmlChar *element,
|
| *end;
|
|
|
| - if ((cur == NULL) || (style == NULL))
|
| + if ((cur == NULL) || (style == NULL) || (cur->type != XML_ELEMENT_NODE))
|
| return;
|
| -
|
| +
|
| prop = xmlGetNsProp(cur, (const xmlChar *) "version", NULL);
|
| if (prop != NULL) {
|
| if (style->version != NULL)
|
| @@ -1281,7 +1291,7 @@ xsltParseStylesheetOutput(xsltStylesheetPtr style, xmlNodePtr cur)
|
| while ((*end != 0) && (!IS_BLANK(*end)))
|
| end++;
|
| element = xmlStrndup(element, end - element);
|
| - if (element) {
|
| + if (element) {
|
| #ifdef WITH_XSLT_DEBUG_PARSING
|
| xsltGenericDebug(xsltGenericDebugContext,
|
| "add cdata section output element %s\n",
|
| @@ -1303,7 +1313,7 @@ xsltParseStylesheetOutput(xsltStylesheetPtr style, xmlNodePtr cur)
|
| if (element == NULL) {
|
| /*
|
| * TODO: We'll report additionally an error
|
| - * via the stylesheet's error handling.
|
| + * via the stylesheet's error handling.
|
| */
|
| xsltTransformError(NULL, style, cur,
|
| "Attribute 'cdata-section-elements': The value "
|
| @@ -1311,7 +1321,7 @@ xsltParseStylesheetOutput(xsltStylesheetPtr style, xmlNodePtr cur)
|
| style->errors++;
|
| } else {
|
| xmlNsPtr ns;
|
| -
|
| +
|
| /*
|
| * XSLT-1.0 "Each QName is expanded into an
|
| * expanded-name using the namespace declarations in
|
| @@ -1324,7 +1334,7 @@ xsltParseStylesheetOutput(xsltStylesheetPtr style, xmlNodePtr cur)
|
| ns = xmlSearchNs(style->doc, cur, NULL);
|
| if (ns != NULL)
|
| URI = ns->href;
|
| - }
|
| + }
|
| xmlHashAddEntry2(style->cdataSection, element, URI,
|
| (void *) "cdata");
|
| xmlFree(element);
|
| @@ -1368,12 +1378,12 @@ xsltParseStylesheetDecimalFormat(xsltStylesheetPtr style, xmlNodePtr cur)
|
| xmlChar *prop;
|
| xsltDecimalFormatPtr format;
|
| xsltDecimalFormatPtr iter;
|
| -
|
| - if ((cur == NULL) || (style == NULL))
|
| +
|
| + if ((cur == NULL) || (style == NULL) || (cur->type != XML_ELEMENT_NODE))
|
| return;
|
|
|
| format = style->decimalFormat;
|
| -
|
| +
|
| prop = xmlGetNsProp(cur, BAD_CAST("name"), NULL);
|
| if (prop != NULL) {
|
| format = xsltDecimalFormatGetByName(style, prop);
|
| @@ -1402,7 +1412,7 @@ xsltParseStylesheetDecimalFormat(xsltStylesheetPtr style, xmlNodePtr cur)
|
| if (format->decimalPoint != NULL) xmlFree(format->decimalPoint);
|
| format->decimalPoint = prop;
|
| }
|
| -
|
| +
|
| prop = xmlGetNsProp(cur, (const xmlChar *)"grouping-separator", NULL);
|
| if (prop != NULL) {
|
| if (format->grouping != NULL) xmlFree(format->grouping);
|
| @@ -1414,43 +1424,43 @@ xsltParseStylesheetDecimalFormat(xsltStylesheetPtr style, xmlNodePtr cur)
|
| if (format->infinity != NULL) xmlFree(format->infinity);
|
| format->infinity = prop;
|
| }
|
| -
|
| +
|
| prop = xmlGetNsProp(cur, (const xmlChar *)"minus-sign", NULL);
|
| if (prop != NULL) {
|
| if (format->minusSign != NULL) xmlFree(format->minusSign);
|
| format->minusSign = prop;
|
| }
|
| -
|
| +
|
| prop = xmlGetNsProp(cur, (const xmlChar *)"NaN", NULL);
|
| if (prop != NULL) {
|
| if (format->noNumber != NULL) xmlFree(format->noNumber);
|
| format->noNumber = prop;
|
| }
|
| -
|
| +
|
| prop = xmlGetNsProp(cur, (const xmlChar *)"percent", NULL);
|
| if (prop != NULL) {
|
| if (format->percent != NULL) xmlFree(format->percent);
|
| format->percent = prop;
|
| }
|
| -
|
| +
|
| prop = xmlGetNsProp(cur, (const xmlChar *)"per-mille", NULL);
|
| if (prop != NULL) {
|
| if (format->permille != NULL) xmlFree(format->permille);
|
| format->permille = prop;
|
| }
|
| -
|
| +
|
| prop = xmlGetNsProp(cur, (const xmlChar *)"zero-digit", NULL);
|
| if (prop != NULL) {
|
| if (format->zeroDigit != NULL) xmlFree(format->zeroDigit);
|
| format->zeroDigit = prop;
|
| }
|
| -
|
| +
|
| prop = xmlGetNsProp(cur, (const xmlChar *)"digit", NULL);
|
| if (prop != NULL) {
|
| if (format->digit != NULL) xmlFree(format->digit);
|
| format->digit = prop;
|
| }
|
| -
|
| +
|
| prop = xmlGetNsProp(cur, (const xmlChar *)"pattern-separator", NULL);
|
| if (prop != NULL) {
|
| if (format->patternSeparator != NULL) xmlFree(format->patternSeparator);
|
| @@ -1475,7 +1485,7 @@ xsltParseStylesheetPreserveSpace(xsltStylesheetPtr style, xmlNodePtr cur) {
|
| xmlChar *elements;
|
| xmlChar *element, *end;
|
|
|
| - if ((cur == NULL) || (style == NULL))
|
| + if ((cur == NULL) || (style == NULL) || (cur->type != XML_ELEMENT_NODE))
|
| return;
|
|
|
| elements = xmlGetNsProp(cur, (const xmlChar *)"elements", NULL);
|
| @@ -1540,7 +1550,7 @@ xsltParseStylesheetPreserveSpace(xsltStylesheetPtr style, xmlNodePtr cur) {
|
| * an extension-element-prefixes attribute on:
|
| * 1) an xsl:stylesheet element
|
| * 2) an xsl:extension-element-prefixes attribute on a
|
| - * literal result element
|
| + * literal result element
|
| * 3) an extension instruction."
|
| */
|
| static void
|
| @@ -1549,7 +1559,7 @@ xsltParseStylesheetExtPrefix(xsltStylesheetPtr style, xmlNodePtr cur,
|
| xmlChar *prefixes;
|
| xmlChar *prefix, *end;
|
|
|
| - if ((cur == NULL) || (style == NULL))
|
| + if ((cur == NULL) || (style == NULL) || (cur->type != XML_ELEMENT_NODE))
|
| return;
|
|
|
| if (isXsltElem) {
|
| @@ -1614,7 +1624,7 @@ xsltParseStylesheetStripSpace(xsltStylesheetPtr style, xmlNodePtr cur) {
|
| xmlChar *elements;
|
| xmlChar *element, *end;
|
|
|
| - if ((cur == NULL) || (style == NULL))
|
| + if ((cur == NULL) || (style == NULL) || (cur->type != XML_ELEMENT_NODE))
|
| return;
|
|
|
| elements = xmlGetNsProp(cur, (const xmlChar *)"elements", NULL);
|
| @@ -1687,7 +1697,7 @@ xsltParseStylesheetExcludePrefix(xsltStylesheetPtr style, xmlNodePtr cur,
|
| xmlChar *prefixes;
|
| xmlChar *prefix, *end;
|
|
|
| - if ((cur == NULL) || (style == NULL))
|
| + if ((cur == NULL) || (style == NULL) || (cur->type != XML_ELEMENT_NODE))
|
| return(0);
|
|
|
| if (isXsltElem)
|
| @@ -1744,11 +1754,11 @@ xsltParseStylesheetExcludePrefix(xsltStylesheetPtr style, xmlNodePtr cur,
|
| /*
|
| * xsltTreeEnsureXMLDecl:
|
| * @doc: the doc
|
| -*
|
| +*
|
| * BIG NOTE:
|
| * This was copy&pasted from Libxml2's xmlTreeEnsureXMLDecl() in "tree.c".
|
| * Ensures that there is an XML namespace declaration on the doc.
|
| -*
|
| +*
|
| * Returns the XML ns-struct or NULL on API and internal errors.
|
| */
|
| static xmlNsPtr
|
| @@ -1764,7 +1774,7 @@ xsltTreeEnsureXMLDecl(xmlDocPtr doc)
|
| if (ns == NULL) {
|
| xmlGenericError(xmlGenericErrorContext,
|
| "xsltTreeEnsureXMLDecl: Failed to allocate "
|
| - "the XML namespace.\n");
|
| + "the XML namespace.\n");
|
| return (NULL);
|
| }
|
| memset(ns, 0, sizeof(xmlNs));
|
| @@ -1778,7 +1788,7 @@ xsltTreeEnsureXMLDecl(xmlDocPtr doc)
|
| else
|
| ns->href = xmlStrdup(XML_XML_NAMESPACE);
|
| #else
|
| - ns->href = xmlStrdup(XML_XML_NAMESPACE);
|
| + ns->href = xmlStrdup(XML_XML_NAMESPACE);
|
| #endif
|
| ns->prefix = xmlStrdup((const xmlChar *)"xml");
|
| doc->oldNs = ns;
|
| @@ -1791,12 +1801,12 @@ xsltTreeEnsureXMLDecl(xmlDocPtr doc)
|
| * @doc: the doc
|
| * @nsName: the namespace name
|
| * @prefix: the prefix
|
| -*
|
| +*
|
| * BIG NOTE:
|
| * This was copy&pasted from Libxml2's xmlDOMWrapStoreNs() in "tree.c".
|
| * Creates or reuses an xmlNs struct on doc->oldNs with
|
| * the given prefix and namespace name.
|
| -*
|
| +*
|
| * Returns the aquired ns struct or NULL in case of an API
|
| * or internal error.
|
| */
|
| @@ -1829,7 +1839,7 @@ xsltTreeAcquireStoredNs(xmlDocPtr doc,
|
| xmlStrEqual(ns->prefix, prefix) &&
|
| xmlStrEqual(ns->href, nsName))
|
| return (ns);
|
| -
|
| +
|
| }
|
| if (ns->next == NULL)
|
| break;
|
| @@ -1859,7 +1869,7 @@ xsltLREBuildEffectiveNs(xsltCompilerCtxtPtr cctxt,
|
| if ((cctxt->nsAliases == NULL) || (! cctxt->hasNsAliases))
|
| return(0);
|
|
|
| - alias = cctxt->nsAliases;
|
| + alias = cctxt->nsAliases;
|
| while (alias != NULL) {
|
| if ( /* If both namespaces are NULL... */
|
| ( (elem->ns == NULL) &&
|
| @@ -1892,7 +1902,7 @@ xsltLREBuildEffectiveNs(xsltCompilerCtxtPtr cctxt,
|
| * OPTIMIZE TODO: Use the compiler-node-info inScopeNs.
|
| */
|
| ns = xmlSearchNs(elem->doc, elem,
|
| - alias->targetNs->prefix);
|
| + alias->targetNs->prefix);
|
| /*
|
| * If no matching ns-decl found, then assign a
|
| * ns-decl stored in xmlDoc.
|
| @@ -1914,7 +1924,7 @@ xsltLREBuildEffectiveNs(xsltCompilerCtxtPtr cctxt,
|
| ns = xsltTreeAcquireStoredNs(elem->doc,
|
| alias->targetNs->href,
|
| alias->targetNs->prefix);
|
| -
|
| +
|
| if (ns == NULL) {
|
| xsltTransformError(NULL, cctxt->style, elem,
|
| "Internal error in "
|
| @@ -1923,11 +1933,11 @@ xsltLREBuildEffectiveNs(xsltCompilerCtxtPtr cctxt,
|
| "ns-declaration.\n");
|
| cctxt->style->errors++;
|
| return(-1);
|
| -
|
| +
|
| }
|
| }
|
| elem->ns = ns;
|
| - }
|
| + }
|
| } else {
|
| /*
|
| * Move into or leave in the NULL namespace.
|
| @@ -1943,7 +1953,7 @@ xsltLREBuildEffectiveNs(xsltCompilerCtxtPtr cctxt,
|
| */
|
| if (elem->properties != NULL) {
|
| xmlAttrPtr attr = elem->properties;
|
| -
|
| +
|
| while (attr != NULL) {
|
| if (attr->ns == NULL) {
|
| attr = attr->next;
|
| @@ -1962,7 +1972,7 @@ xsltLREBuildEffectiveNs(xsltCompilerCtxtPtr cctxt,
|
| {
|
| if ((alias->targetNs != NULL) &&
|
| (alias->targetNs->href != NULL))
|
| - {
|
| + {
|
| if (elem->doc == alias->docOfTargetNs) {
|
| elem->ns = alias->targetNs;
|
| } else {
|
| @@ -1974,7 +1984,7 @@ xsltLREBuildEffectiveNs(xsltCompilerCtxtPtr cctxt,
|
| ns = xsltTreeAcquireStoredNs(elem->doc,
|
| alias->targetNs->href,
|
| alias->targetNs->prefix);
|
| -
|
| +
|
| if (ns == NULL) {
|
| xsltTransformError(NULL, cctxt->style, elem,
|
| "Internal error in "
|
| @@ -1983,7 +1993,7 @@ xsltLREBuildEffectiveNs(xsltCompilerCtxtPtr cctxt,
|
| "ns-declaration.\n");
|
| cctxt->style->errors++;
|
| return(-1);
|
| -
|
| +
|
| }
|
| }
|
| elem->ns = ns;
|
| @@ -1998,7 +2008,7 @@ xsltLREBuildEffectiveNs(xsltCompilerCtxtPtr cctxt,
|
| }
|
| alias = alias->next;
|
| }
|
| -
|
| +
|
| attr = attr->next;
|
| }
|
| }
|
| @@ -2034,7 +2044,7 @@ xsltLREBuildEffectiveNsNodes(xsltCompilerCtxtPtr cctxt,
|
| (item == NULL) || (item->effectiveNs != NULL))
|
| return(-1);
|
|
|
| - if (item->inScopeNs == NULL)
|
| + if (item->inScopeNs == NULL)
|
| return(0);
|
|
|
| extElemNs = cctxt->inode->extElemNs;
|
| @@ -2065,7 +2075,7 @@ xsltLREBuildEffectiveNsNodes(xsltCompilerCtxtPtr cctxt,
|
| * - A namespace node whose string value is a target namespace URI
|
| * is copied to the result tree, whether or not the URI
|
| * identifies an excluded namespace."
|
| - *
|
| + *
|
| * NOTE: The ns-aliasing machanism is non-cascading.
|
| * (checked with Saxon, Xalan and MSXML .NET).
|
| * URGENT TODO: is style->nsAliases the effective list of
|
| @@ -2111,7 +2121,7 @@ xsltLREBuildEffectiveNsNodes(xsltCompilerCtxtPtr cctxt,
|
| alias = alias->next;
|
| } while (alias != NULL);
|
| }
|
| -
|
| +
|
| /*
|
| * Exclude excluded result namespaces.
|
| */
|
| @@ -2142,11 +2152,11 @@ add_effective_ns:
|
| break;
|
| }
|
| tmpns = tmpns->next;
|
| - } while (tmpns != NULL);
|
| + } while (tmpns != NULL);
|
| } else
|
| holdByElem = 0;
|
| -
|
| -
|
| +
|
| +
|
| /*
|
| * Add the effective namespace declaration.
|
| */
|
| @@ -2160,7 +2170,7 @@ add_effective_ns:
|
| }
|
| if (cctxt->psData->effectiveNs == NULL) {
|
| cctxt->psData->effectiveNs = effNs;
|
| - effNs->nextInStore = NULL;
|
| + effNs->nextInStore = NULL;
|
| } else {
|
| effNs->nextInStore = cctxt->psData->effectiveNs;
|
| cctxt->psData->effectiveNs = effNs;
|
| @@ -2170,13 +2180,13 @@ add_effective_ns:
|
| effNs->prefix = ns->prefix;
|
| effNs->nsName = ns->href;
|
| effNs->holdByElem = holdByElem;
|
| -
|
| +
|
| if (lastEffNs == NULL)
|
| item->effectiveNs = effNs;
|
| else
|
| lastEffNs->next = effNs;
|
| lastEffNs = effNs;
|
| -
|
| +
|
| skip_ns:
|
| {}
|
| }
|
| @@ -2222,7 +2232,7 @@ xsltLREInfoCreate(xsltCompilerCtxtPtr cctxt,
|
| * in AVTs.
|
| */
|
| item->inScopeNs = cctxt->inode->inScopeNs;
|
| -
|
| +
|
| if (elem)
|
| xsltLREBuildEffectiveNsNodes(cctxt, item, elem, isLRE);
|
|
|
| @@ -2233,13 +2243,13 @@ xsltLREInfoCreate(xsltCompilerCtxtPtr cctxt,
|
| }
|
|
|
| /**
|
| - * xsltCompilerVarInfoPush:
|
| + * xsltCompilerVarInfoPush:
|
| * @cctxt: the compilation context
|
| - *
|
| + *
|
| * Pushes a new var/param info onto the stack.
|
| *
|
| * Returns the acquired variable info.
|
| - */
|
| + */
|
| static xsltVarInfoPtr
|
| xsltCompilerVarInfoPush(xsltCompilerCtxtPtr cctxt,
|
| xmlNodePtr inst,
|
| @@ -2278,12 +2288,12 @@ xsltCompilerVarInfoPush(xsltCompilerCtxtPtr cctxt,
|
| }
|
|
|
| /**
|
| - * xsltCompilerVarInfoPop:
|
| + * xsltCompilerVarInfoPop:
|
| * @cctxt: the compilation context
|
| - *
|
| + *
|
| * Pops all var/param infos from the stack, which
|
| * have the current depth.
|
| - */
|
| + */
|
| static void
|
| xsltCompilerVarInfoPop(xsltCompilerCtxtPtr cctxt)
|
| {
|
| @@ -2301,20 +2311,20 @@ xsltCompilerVarInfoPop(xsltCompilerCtxtPtr cctxt)
|
| * @cctxt: the compilation context
|
| * @node: the node to be pushed (this can also be the doc-node)
|
| *
|
| -*
|
| +*
|
| *
|
| * Returns the current node info structure or
|
| * NULL in case of an internal error.
|
| */
|
| static xsltCompilerNodeInfoPtr
|
| xsltCompilerNodePush(xsltCompilerCtxtPtr cctxt, xmlNodePtr node)
|
| -{
|
| +{
|
| xsltCompilerNodeInfoPtr inode, iprev;
|
|
|
| - if ((cctxt->inode != NULL) && (cctxt->inode->next != NULL)) {
|
| + if ((cctxt->inode != NULL) && (cctxt->inode->next != NULL)) {
|
| inode = cctxt->inode->next;
|
| } else if ((cctxt->inode == NULL) && (cctxt->inodeList != NULL)) {
|
| - inode = cctxt->inodeList;
|
| + inode = cctxt->inodeList;
|
| } else {
|
| /*
|
| * Create a new node-info.
|
| @@ -2334,7 +2344,7 @@ xsltCompilerNodePush(xsltCompilerCtxtPtr cctxt, xmlNodePtr node)
|
| inode->prev = cctxt->inodeLast;
|
| }
|
| cctxt->inodeLast = inode;
|
| - cctxt->maxNodeInfos++;
|
| + cctxt->maxNodeInfos++;
|
| if (cctxt->inode == NULL) {
|
| cctxt->inode = inode;
|
| /*
|
| @@ -2342,12 +2352,12 @@ xsltCompilerNodePush(xsltCompilerCtxtPtr cctxt, xmlNodePtr node)
|
| * the root of the stylesheet.
|
| */
|
| xsltLREInfoCreate(cctxt, NULL, 0);
|
| - }
|
| - }
|
| + }
|
| + }
|
| cctxt->depth++;
|
| cctxt->inode = inode;
|
| /*
|
| - * REVISIT TODO: Keep the reset always complete.
|
| + * REVISIT TODO: Keep the reset always complete.
|
| * NOTE: Be carefull with the @node, since it might be
|
| * a doc-node.
|
| */
|
| @@ -2360,7 +2370,7 @@ xsltCompilerNodePush(xsltCompilerCtxtPtr cctxt, xmlNodePtr node)
|
| inode->curChildType = 0;
|
| inode->extContentHandled = 0;
|
| inode->isRoot = 0;
|
| -
|
| +
|
| if (inode->prev != NULL) {
|
| iprev = inode->prev;
|
| /*
|
| @@ -2390,7 +2400,7 @@ xsltCompilerNodePush(xsltCompilerCtxtPtr cctxt, xmlNodePtr node)
|
| /*
|
| * Forwards-compatible mode
|
| */
|
| - inode->forwardsCompat = iprev->forwardsCompat;
|
| + inode->forwardsCompat = iprev->forwardsCompat;
|
| } else {
|
| inode->inScopeNs = NULL;
|
| inode->exclResultNs = NULL;
|
| @@ -2398,7 +2408,7 @@ xsltCompilerNodePush(xsltCompilerCtxtPtr cctxt, xmlNodePtr node)
|
| inode->preserveWhitespace = 0;
|
| inode->forwardsCompat = 0;
|
| }
|
| -
|
| +
|
| return(inode);
|
| }
|
|
|
| @@ -2412,7 +2422,7 @@ xsltCompilerNodePush(xsltCompilerCtxtPtr cctxt, xmlNodePtr node)
|
| */
|
| static void
|
| xsltCompilerNodePop(xsltCompilerCtxtPtr cctxt, xmlNodePtr node)
|
| -{
|
| +{
|
| if (cctxt->inode == NULL) {
|
| xmlGenericError(xmlGenericErrorContext,
|
| "xsltCompilerNodePop: Top-node mismatch.\n");
|
| @@ -2432,13 +2442,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;
|
| @@ -2448,7 +2458,7 @@ mismatch:
|
| {
|
| const xmlChar *nsName = NULL, *name = NULL;
|
| const xmlChar *infnsName = NULL, *infname = NULL;
|
| -
|
| +
|
| if (node) {
|
| if (node->type == XML_ELEMENT_NODE) {
|
| name = node->name;
|
| @@ -2477,7 +2487,7 @@ mismatch:
|
| } else
|
| infname = BAD_CAST "Not given";
|
|
|
| -
|
| +
|
| xmlGenericError(xmlGenericErrorContext,
|
| "xsltCompilerNodePop: Given : '%s' URI '%s'\n",
|
| name, nsName);
|
| @@ -2585,7 +2595,7 @@ xsltCompilerBuildInScopeNsList(xsltCompilerCtxtPtr cctxt, xmlNodePtr node)
|
| if (xsltPointerListAddSize(
|
| (xsltPointerListPtr)cctxt->psData->inScopeNamespaces,
|
| (void *) nsi, 5) == -1)
|
| - {
|
| + {
|
| xmlFree(nsi);
|
| nsi = NULL;
|
| xsltTransformError(NULL, cctxt->style, NULL,
|
| @@ -2602,7 +2612,7 @@ xsltCompilerBuildInScopeNsList(xsltCompilerCtxtPtr cctxt, xmlNodePtr node)
|
|
|
| internal_err:
|
| if (list != NULL)
|
| - xmlFree(list);
|
| + xmlFree(list);
|
| cctxt->style->errors++;
|
| return(NULL);
|
| }
|
| @@ -2615,7 +2625,7 @@ xsltParseNsPrefixList(xsltCompilerCtxtPtr cctxt,
|
| {
|
| xmlChar *cur, *end;
|
| xmlNsPtr ns;
|
| -
|
| +
|
| if ((cctxt == NULL) || (value == NULL) || (list == NULL))
|
| return(-1);
|
|
|
| @@ -2632,7 +2642,7 @@ xsltParseNsPrefixList(xsltCompilerCtxtPtr cctxt,
|
| if (cur == NULL) {
|
| cur = end;
|
| continue;
|
| - }
|
| + }
|
| /*
|
| * TODO: Export and use xmlSearchNsByPrefixStrict()
|
| * in Libxml2, tree.c, since xmlSearchNs() is in most
|
| @@ -2644,7 +2654,7 @@ xsltParseNsPrefixList(xsltCompilerCtxtPtr cctxt,
|
| xmlStrEqual(cur, (const xmlChar *)"#default"))
|
| ns = xmlSearchNs(cctxt->style->doc, node, NULL);
|
| else
|
| - ns = xmlSearchNs(cctxt->style->doc, node, cur);
|
| + ns = xmlSearchNs(cctxt->style->doc, node, cur);
|
|
|
| if (ns == NULL) {
|
| /*
|
| @@ -2677,7 +2687,7 @@ xsltParseNsPrefixList(xsltCompilerCtxtPtr cctxt,
|
| }
|
| }
|
| xmlFree(cur);
|
| -
|
| +
|
| cur = end;
|
| }
|
| return(0);
|
| @@ -2710,7 +2720,7 @@ xsltCompilerUtilsCreateMergedList(xsltPointerListPtr first,
|
| else
|
| num = 0;
|
| if (second)
|
| - num += second->number;
|
| + num += second->number;
|
| if (num == 0)
|
| return(NULL);
|
| ret = xsltPointerListCreate(num);
|
| @@ -2746,7 +2756,7 @@ static xsltPointerListPtr
|
| xsltParseExclResultPrefixes(xsltCompilerCtxtPtr cctxt, xmlNodePtr node,
|
| xsltPointerListPtr def,
|
| int instrCategory)
|
| -{
|
| +{
|
| xsltPointerListPtr list = NULL;
|
| xmlChar *value;
|
| xmlAttrPtr attr;
|
| @@ -2759,7 +2769,7 @@ xsltParseExclResultPrefixes(xsltCompilerCtxtPtr cctxt, xmlNodePtr node,
|
| else
|
| attr = xmlHasNsProp(node, BAD_CAST "exclude-result-prefixes",
|
| XSLT_NAMESPACE);
|
| - if (attr == NULL)
|
| + if (attr == NULL)
|
| return(def);
|
|
|
| if (attr && (instrCategory == XSLT_ELEMENT_CATEGORY_LRE)) {
|
| @@ -2769,7 +2779,7 @@ xsltParseExclResultPrefixes(xsltCompilerCtxtPtr cctxt, xmlNodePtr node,
|
| attr->psvi = (void *) xsltXSLTAttrMarker;
|
| }
|
|
|
| - if ((attr->children != NULL) &&
|
| + if ((attr->children != NULL) &&
|
| (attr->children->content != NULL))
|
| value = attr->children->content;
|
| else {
|
| @@ -2777,19 +2787,19 @@ xsltParseExclResultPrefixes(xsltCompilerCtxtPtr cctxt, xmlNodePtr node,
|
| "Attribute 'exclude-result-prefixes': Invalid value.\n");
|
| cctxt->style->errors++;
|
| return(def);
|
| - }
|
| + }
|
|
|
| if (xsltParseNsPrefixList(cctxt, cctxt->tmpList, node,
|
| BAD_CAST value) != 0)
|
| goto exit;
|
| - if (cctxt->tmpList->number == 0)
|
| - goto exit;
|
| + if (cctxt->tmpList->number == 0)
|
| + goto exit;
|
| /*
|
| * Merge the list with the inherited list.
|
| */
|
| list = xsltCompilerUtilsCreateMergedList(def, cctxt->tmpList);
|
| if (list == NULL)
|
| - goto exit;
|
| + goto exit;
|
| /*
|
| * Store the list in the stylesheet/compiler context.
|
| */
|
| @@ -2806,7 +2816,7 @@ xsltParseExclResultPrefixes(xsltCompilerCtxtPtr cctxt, xmlNodePtr node,
|
| if (cctxt->inode != NULL)
|
| cctxt->inode->nsChanged = 1;
|
|
|
| -exit:
|
| +exit:
|
| if (list != NULL)
|
| return(list);
|
| else
|
| @@ -2827,7 +2837,7 @@ static xsltPointerListPtr
|
| xsltParseExtElemPrefixes(xsltCompilerCtxtPtr cctxt, xmlNodePtr node,
|
| xsltPointerListPtr def,
|
| int instrCategory)
|
| -{
|
| +{
|
| xsltPointerListPtr list = NULL;
|
| xmlAttrPtr attr;
|
| xmlChar *value;
|
| @@ -2841,7 +2851,7 @@ xsltParseExtElemPrefixes(xsltCompilerCtxtPtr cctxt, xmlNodePtr node,
|
| else
|
| attr = xmlHasNsProp(node, BAD_CAST "extension-element-prefixes",
|
| XSLT_NAMESPACE);
|
| - if (attr == NULL)
|
| + if (attr == NULL)
|
| return(def);
|
|
|
| if (attr && (instrCategory == XSLT_ELEMENT_CATEGORY_LRE)) {
|
| @@ -2851,7 +2861,7 @@ xsltParseExtElemPrefixes(xsltCompilerCtxtPtr cctxt, xmlNodePtr node,
|
| attr->psvi = (void *) xsltXSLTAttrMarker;
|
| }
|
|
|
| - if ((attr->children != NULL) &&
|
| + if ((attr->children != NULL) &&
|
| (attr->children->content != NULL))
|
| value = attr->children->content;
|
| else {
|
| @@ -2867,7 +2877,7 @@ xsltParseExtElemPrefixes(xsltCompilerCtxtPtr cctxt, xmlNodePtr node,
|
| goto exit;
|
|
|
| if (cctxt->tmpList->number == 0)
|
| - goto exit;
|
| + goto exit;
|
| /*
|
| * REVISIT: Register the extension namespaces.
|
| */
|
| @@ -2896,7 +2906,7 @@ xsltParseExtElemPrefixes(xsltCompilerCtxtPtr cctxt, xmlNodePtr node,
|
| if (cctxt->inode != NULL)
|
| cctxt->inode->nsChanged = 1;
|
|
|
| -exit:
|
| +exit:
|
| if (list != NULL)
|
| return(list);
|
| else
|
| @@ -2916,7 +2926,7 @@ exit:
|
| * -1 if an internal or API error occured.
|
| */
|
| static int
|
| -xsltParseAttrXSLTVersion(xsltCompilerCtxtPtr cctxt, xmlNodePtr node,
|
| +xsltParseAttrXSLTVersion(xsltCompilerCtxtPtr cctxt, xmlNodePtr node,
|
| int instrCategory)
|
| {
|
| xmlChar *value;
|
| @@ -2930,12 +2940,12 @@ xsltParseAttrXSLTVersion(xsltCompilerCtxtPtr cctxt, xmlNodePtr node,
|
| else
|
| attr = xmlHasNsProp(node, BAD_CAST "version", XSLT_NAMESPACE);
|
|
|
| - if (attr == NULL)
|
| + if (attr == NULL)
|
| return(0);
|
|
|
| attr->psvi = (void *) xsltXSLTAttrMarker;
|
|
|
| - if ((attr->children != NULL) &&
|
| + if ((attr->children != NULL) &&
|
| (attr->children->content != NULL))
|
| value = attr->children->content;
|
| else {
|
| @@ -2944,7 +2954,7 @@ xsltParseAttrXSLTVersion(xsltCompilerCtxtPtr cctxt, xmlNodePtr node,
|
| cctxt->style->errors++;
|
| return(1);
|
| }
|
| -
|
| +
|
| if (! xmlStrEqual(value, (const xmlChar *)"1.0")) {
|
| cctxt->inode->forwardsCompat = 1;
|
| /*
|
| @@ -2964,7 +2974,7 @@ xsltParseAttrXSLTVersion(xsltCompilerCtxtPtr cctxt, xmlNodePtr node,
|
| "processor.\n");
|
| cctxt->style->warnings++;
|
| cctxt->errSeverity = XSLT_ERROR_SEVERITY_ERROR;
|
| - }
|
| + }
|
| } else {
|
| cctxt->inode->forwardsCompat = 0;
|
| }
|
| @@ -3022,8 +3032,8 @@ xsltParsePreprocessStylesheetTree(xsltCompilerCtxtPtr cctxt, xmlNodePtr node)
|
| if (xmlNodeGetSpacePreserve(node) != 1)
|
| cctxt->inode->preserveWhitespace = 0;
|
| else
|
| - cctxt->inode->preserveWhitespace = 1;
|
| -
|
| + cctxt->inode->preserveWhitespace = 1;
|
| +
|
| /*
|
| * Eval if we should keep the old incorrect behaviour.
|
| */
|
| @@ -3045,7 +3055,7 @@ xsltParsePreprocessStylesheetTree(xsltCompilerCtxtPtr cctxt, xmlNodePtr node)
|
| deleteNode = NULL;
|
| }
|
| if (cur->type == XML_ELEMENT_NODE) {
|
| -
|
| +
|
| /*
|
| * Clear the PSVI field.
|
| */
|
| @@ -3054,8 +3064,8 @@ xsltParsePreprocessStylesheetTree(xsltCompilerCtxtPtr cctxt, xmlNodePtr node)
|
| xsltCompilerNodePush(cctxt, cur);
|
|
|
| inXSLText = 0;
|
| - textNode = NULL;
|
| - findSpaceAttr = 1;
|
| + textNode = NULL;
|
| + findSpaceAttr = 1;
|
| cctxt->inode->stripWhitespace = 0;
|
| /*
|
| * TODO: I'd love to use a string pointer comparison here :-/
|
| @@ -3086,18 +3096,18 @@ xsltParsePreprocessStylesheetTree(xsltCompilerCtxtPtr cctxt, xmlNodePtr node)
|
| * XSLT 2.0: "Any whitespace text node whose parent is
|
| * one of the following elements is removed from the "
|
| * tree, regardless of any xml:space attributes:..."
|
| - * xsl:apply-imports,
|
| + * xsl:apply-imports,
|
| * xsl:apply-templates,
|
| * xsl:attribute-set,
|
| - * xsl:call-template,
|
| + * xsl:call-template,
|
| * xsl:choose,
|
| * xsl:stylesheet, xsl:transform.
|
| * XSLT 2.0: xsl:analyze-string,
|
| * xsl:character-map,
|
| - * xsl:next-match
|
| + * xsl:next-match
|
| *
|
| * TODO: I'd love to use a string pointer comparison here :-/
|
| - */
|
| + */
|
| name = cur->name;
|
| switch (*name) {
|
| case 't':
|
| @@ -3119,7 +3129,7 @@ xsltParsePreprocessStylesheetTree(xsltCompilerCtxtPtr cctxt, xmlNodePtr node)
|
| findSpaceAttr = 0;
|
| cctxt->inode->preserveWhitespace = 1;
|
| inXSLText = 1;
|
| - }
|
| + }
|
| break;
|
| case 'c':
|
| if (xmlStrEqual(name, BAD_CAST "choose") ||
|
| @@ -3168,7 +3178,7 @@ xsltParsePreprocessStylesheetTree(xsltCompilerCtxtPtr cctxt, xmlNodePtr node)
|
| */
|
| break;
|
| }
|
| - } while (cur->prev);
|
| + } while (cur->prev);
|
| }
|
| }
|
| break;
|
| @@ -3188,13 +3198,13 @@ process_attributes:
|
| #ifdef XSLT_REFACTORED_XSLT_NSCOMP
|
| if ((attr->ns) && (attr->ns->href != nsNameXSLT) &&
|
| xmlStrEqual(attr->ns->href, nsNameXSLT))
|
| - {
|
| + {
|
| nsMapItem = xsltNewNamespaceMapItem(cctxt,
|
| doc, attr->ns, cur);
|
| if (nsMapItem == NULL)
|
| goto internal_err;
|
| attr->ns->href = nsNameXSLT;
|
| - }
|
| + }
|
| #endif
|
| if (internalize) {
|
| /*
|
| @@ -3223,7 +3233,7 @@ process_attributes:
|
| if ((findSpaceAttr != 0) &&
|
| (attr->ns != NULL) &&
|
| (attr->name != NULL) &&
|
| - (attr->name[0] == 's') &&
|
| + (attr->name[0] == 's') &&
|
| (attr->ns->prefix != NULL) &&
|
| (attr->ns->prefix[0] == 'x') &&
|
| (attr->ns->prefix[1] == 'm') &&
|
| @@ -3234,7 +3244,7 @@ process_attributes:
|
| XML_XML_NAMESPACE);
|
| if (value != NULL) {
|
| if (xmlStrEqual(value, BAD_CAST "preserve")) {
|
| - cctxt->inode->preserveWhitespace = 1;
|
| + cctxt->inode->preserveWhitespace = 1;
|
| } else if (xmlStrEqual(value, BAD_CAST "default")) {
|
| cctxt->inode->preserveWhitespace = 0;
|
| } else {
|
| @@ -3246,7 +3256,7 @@ process_attributes:
|
| findSpaceAttr = 0;
|
| xmlFree(value);
|
| }
|
| -
|
| +
|
| }
|
| attr = attr->next;
|
| } while (attr != NULL);
|
| @@ -3263,17 +3273,17 @@ process_attributes:
|
| {
|
| /*
|
| * Merge adjacent text/CDATA-section-nodes
|
| - * ---------------------------------------
|
| + * ---------------------------------------
|
| * In order to avoid breaking of existing stylesheets,
|
| * if the old behaviour is wanted (strictWhitespace == 0),
|
| * then we *won't* merge adjacent text-nodes
|
| * (except in xsl:text); this will ensure that whitespace-only
|
| * text nodes are (incorrectly) not stripped in some cases.
|
| - *
|
| + *
|
| * Example: : <foo> <!-- bar -->zoo</foo>
|
| * Corrent (strict) result: <foo> zoo</foo>
|
| * Incorrect (old) result : <foo>zoo</foo>
|
| - *
|
| + *
|
| * NOTE that we *will* merge adjacent text-nodes if
|
| * they are in xsl:text.
|
| * Example, the following:
|
| @@ -3305,10 +3315,10 @@ process_attributes:
|
| if (textNode == NULL)
|
| textNode = cur;
|
| goto end_of_text;
|
| - }
|
| + }
|
| } else if ((cur->type == XML_COMMENT_NODE) ||
|
| (cur->type == XML_PI_NODE))
|
| - {
|
| + {
|
| /*
|
| * Remove processing instructions and comments.
|
| */
|
| @@ -3344,7 +3354,7 @@ end_of_text:
|
| (! cctxt->inode->preserveWhitespace)) &&
|
| IS_BLANK(*value) &&
|
| xsltIsBlank(value)))
|
| - {
|
| + {
|
| if (textNode != cur) {
|
| xmlUnlinkNode(textNode);
|
| xmlFreeNode(textNode);
|
| @@ -3494,7 +3504,7 @@ xsltPrecomputeStylesheet(xsltStylesheetPtr style, xmlNodePtr cur)
|
| } else {
|
| exclPrefixes = xsltParseStylesheetExcludePrefix(style, cur, 0);
|
| }
|
| -
|
| +
|
| if ((cur->nsDef != NULL) && (style->exclPrefixNr > 0)) {
|
| xmlNsPtr ns = cur->nsDef, prev = NULL, next;
|
| xmlNodePtr root = NULL;
|
| @@ -3506,7 +3516,7 @@ xsltPrecomputeStylesheet(xsltStylesheetPtr style, xmlNodePtr cur)
|
| moved = 0;
|
| next = ns->next;
|
| for (i = 0;i < style->exclPrefixNr;i++) {
|
| - if ((ns->prefix != NULL) &&
|
| + if ((ns->prefix != NULL) &&
|
| (xmlStrEqual(ns->href,
|
| style->exclPrefixTab[i]))) {
|
| /*
|
| @@ -3630,7 +3640,7 @@ xsltGatherNamespaces(xsltStylesheetPtr style) {
|
|
|
| if (style == NULL)
|
| return;
|
| - /*
|
| + /*
|
| * TODO: basically if the stylesheet uses the same prefix for different
|
| * patterns, well they may be in problem, hopefully they will get
|
| * a warning first.
|
| @@ -3640,7 +3650,7 @@ xsltGatherNamespaces(xsltStylesheetPtr style) {
|
| * An expression should be evaluated in the context of the in-scope
|
| * namespaces; eliminate the restriction of an XML document to contain
|
| * no duplicate prefixes for different namespace names.
|
| - *
|
| + *
|
| */
|
| cur = xmlDocGetRootElement(style->doc);
|
| while (cur != NULL) {
|
| @@ -3689,7 +3699,7 @@ xsltGatherNamespaces(xsltStylesheetPtr style) {
|
| cur = cur->next;
|
| continue;
|
| }
|
| -
|
| +
|
| do {
|
| cur = cur->parent;
|
| if (cur == NULL)
|
| @@ -3831,7 +3841,7 @@ xsltGetXSLTElementTypeByNode(xsltCompilerCtxtPtr cctxt,
|
| *
|
| * Returns 0 if everything's fine;
|
| * -1 on API or internal errors.
|
| - */
|
| + */
|
| int
|
| xsltParseAnyXSLTElem(xsltCompilerCtxtPtr cctxt, xmlNodePtr elem)
|
| {
|
| @@ -3849,7 +3859,7 @@ xsltParseAnyXSLTElem(xsltCompilerCtxtPtr cctxt, xmlNodePtr elem)
|
| if (cctxt->inode->category == XSLT_ELEMENT_CATEGORY_EXTENSION) {
|
| cctxt->inode->extContentHandled = 1;
|
| }
|
| -
|
| +
|
| xsltCompilerNodePush(cctxt, elem);
|
| /*
|
| * URGENT TODO: Find a way to speed up this annoying redundant
|
| @@ -3858,7 +3868,7 @@ xsltParseAnyXSLTElem(xsltCompilerCtxtPtr cctxt, xmlNodePtr elem)
|
| if (cctxt->inode->prev->curChildType != 0)
|
| cctxt->inode->type = cctxt->inode->prev->curChildType;
|
| else
|
| - cctxt->inode->type = xsltGetXSLTElementTypeByNode(cctxt, elem);
|
| + cctxt->inode->type = xsltGetXSLTElementTypeByNode(cctxt, elem);
|
| /*
|
| * Update the in-scope namespaces if needed.
|
| */
|
| @@ -3879,31 +3889,31 @@ xsltParseAnyXSLTElem(xsltCompilerCtxtPtr cctxt, xmlNodePtr elem)
|
| /*
|
| * Validate the content model of the XSLT-element.
|
| */
|
| - switch (cctxt->inode->type) {
|
| + switch (cctxt->inode->type) {
|
| case XSLT_FUNC_APPLYIMPORTS:
|
| /* EMPTY */
|
| goto empty_content;
|
| case XSLT_FUNC_APPLYTEMPLATES:
|
| /* <!-- Content: (xsl:sort | xsl:with-param)* --> */
|
| - goto apply_templates;
|
| - case XSLT_FUNC_ATTRIBUTE:
|
| + goto apply_templates;
|
| + case XSLT_FUNC_ATTRIBUTE:
|
| /* <!-- Content: template --> */
|
| goto sequence_constructor;
|
| case XSLT_FUNC_CALLTEMPLATE:
|
| /* <!-- Content: xsl:with-param* --> */
|
| goto call_template;
|
| - case XSLT_FUNC_CHOOSE:
|
| + case XSLT_FUNC_CHOOSE:
|
| /* <!-- Content: (xsl:when+, xsl:otherwise?) --> */
|
| goto choose;
|
| case XSLT_FUNC_COMMENT:
|
| /* <!-- Content: template --> */
|
| - goto sequence_constructor;
|
| + goto sequence_constructor;
|
| case XSLT_FUNC_COPY:
|
| /* <!-- Content: template --> */
|
| - goto sequence_constructor;
|
| + goto sequence_constructor;
|
| case XSLT_FUNC_COPYOF:
|
| /* EMPTY */
|
| - goto empty_content;
|
| + goto empty_content;
|
| case XSLT_FUNC_DOCUMENT: /* Extra one */
|
| /* ?? template ?? */
|
| goto sequence_constructor;
|
| @@ -3970,7 +3980,7 @@ xsltParseAnyXSLTElem(xsltCompilerCtxtPtr cctxt, xmlNodePtr elem)
|
| * Check for redefinition.
|
| */
|
| if ((elem->psvi != NULL) && (cctxt->ivar != NULL)) {
|
| - xsltVarInfoPtr ivar = cctxt->ivar;
|
| + xsltVarInfoPtr ivar = cctxt->ivar;
|
|
|
| do {
|
| if ((ivar->name ==
|
| @@ -4000,7 +4010,7 @@ xsltParseAnyXSLTElem(xsltCompilerCtxtPtr cctxt, xmlNodePtr elem)
|
| #ifdef WITH_XSLT_DEBUG_PARSING
|
| xsltGenericDebug(xsltGenericDebugContext,
|
| "xsltParseXSLTNode: Unhandled XSLT element '%s'.\n",
|
| - elem->name);
|
| + elem->name);
|
| #endif
|
| xsltTransformError(NULL, cctxt->style, elem,
|
| "xsltParseXSLTNode: Internal error; "
|
| @@ -4029,7 +4039,7 @@ apply_templates:
|
| }
|
| child = child->next;
|
| } while (child != NULL);
|
| - }
|
| + }
|
| goto exit;
|
|
|
| call_template:
|
| @@ -4053,7 +4063,7 @@ call_template:
|
| }
|
| child = child->next;
|
| } while (child != NULL);
|
| - }
|
| + }
|
| goto exit;
|
|
|
| text:
|
| @@ -4089,7 +4099,7 @@ empty_content:
|
| break;
|
| }
|
| child = child->next;
|
| - } while (child != NULL);
|
| + } while (child != NULL);
|
| }
|
| goto exit;
|
|
|
| @@ -4108,7 +4118,7 @@ choose:
|
| if (child->type == XML_ELEMENT_NODE) {
|
| if (IS_XSLT_ELEM_FAST(child)) {
|
| xsltStyleType type;
|
| -
|
| +
|
| type = xsltGetXSLTElementTypeByNode(cctxt, child);
|
| if (type == XSLT_FUNC_WHEN) {
|
| nbWhen++;
|
| @@ -4124,7 +4134,7 @@ choose:
|
| xsltParseContentError(cctxt->style, child);
|
| err = 1;
|
| break;
|
| - }
|
| + }
|
| if (nbOtherwise) {
|
| xsltTransformError(NULL, cctxt->style, elem,
|
| "The XSLT 'choose' element must not contain "
|
| @@ -4140,7 +4150,7 @@ choose:
|
| xsltParseContentError(cctxt->style, child);
|
| } else
|
| xsltParseContentError(cctxt->style, child);
|
| - }
|
| + }
|
| /*
|
| else
|
| xsltParseContentError(cctxt, child);
|
| @@ -4152,8 +4162,8 @@ choose:
|
| "The XSLT element 'choose' must contain at least one "
|
| "XSLT element 'when'.\n");
|
| cctxt->style->errors++;
|
| - }
|
| - }
|
| + }
|
| + }
|
| goto exit;
|
|
|
| for_each:
|
| @@ -4170,13 +4180,13 @@ for_each:
|
| /*
|
| * Parse xsl:sort first.
|
| */
|
| - do {
|
| + do {
|
| if ((child->type == XML_ELEMENT_NODE) &&
|
| IS_XSLT_ELEM_FAST(child))
|
| - {
|
| + {
|
| if (xsltGetXSLTElementTypeByNode(cctxt, child) ==
|
| XSLT_FUNC_SORT)
|
| - {
|
| + {
|
| cctxt->inode->curChildType = XSLT_FUNC_SORT;
|
| xsltParseAnyXSLTElem(cctxt, child);
|
| } else
|
| @@ -4190,7 +4200,7 @@ for_each:
|
| */
|
| if (child != NULL)
|
| xsltParseSequenceConstructor(cctxt, child);
|
| - }
|
| + }
|
| goto exit;
|
|
|
| sequence_constructor:
|
| @@ -4207,10 +4217,10 @@ sequence_constructor:
|
| if ((elem->next != NULL) &&
|
| ((cctxt->inode->type == XSLT_FUNC_VARIABLE) ||
|
| (cctxt->inode->type == XSLT_FUNC_PARAM)))
|
| - {
|
| + {
|
| if ((elem->psvi != NULL) &&
|
| (((xsltStyleBasicItemVariablePtr) elem->psvi)->name))
|
| - {
|
| + {
|
| xsltCompilerVarInfoPush(cctxt, elem,
|
| ((xsltStyleBasicItemVariablePtr) elem->psvi)->name,
|
| ((xsltStyleBasicItemVariablePtr) elem->psvi)->ns);
|
| @@ -4230,13 +4240,13 @@ internal_err:
|
| /**
|
| * xsltForwardsCompatUnkownItemCreate:
|
| *
|
| - * @cctxt: the compilation context
|
| + * @cctxt: the compilation context
|
| *
|
| * Creates a compiled representation of the unknown
|
| * XSLT instruction.
|
| *
|
| * Returns the compiled representation.
|
| - */
|
| + */
|
| static xsltStyleItemUknownPtr
|
| xsltForwardsCompatUnkownItemCreate(xsltCompilerCtxtPtr cctxt)
|
| {
|
| @@ -4273,12 +4283,12 @@ xsltForwardsCompatUnkownItemCreate(xsltCompilerCtxtPtr cctxt)
|
| * Returns 1 in the unknown XSLT instruction is rejected,
|
| * 0 if everything's fine and
|
| * -1 on API or internal errors.
|
| - */
|
| + */
|
| static int
|
| xsltParseUnknownXSLTElem(xsltCompilerCtxtPtr cctxt,
|
| xmlNodePtr node)
|
| {
|
| - if ((cctxt == NULL) || (node == NULL))
|
| + if ((cctxt == NULL) || (node == NULL) || (node->type != XML_ELEMENT_NODE))
|
| return(-1);
|
|
|
| /*
|
| @@ -4286,8 +4296,8 @@ xsltParseUnknownXSLTElem(xsltCompilerCtxtPtr cctxt,
|
| */
|
| if (cctxt->inode->category == XSLT_ELEMENT_CATEGORY_EXTENSION) {
|
| cctxt->inode->extContentHandled = 1;
|
| - }
|
| - if (cctxt->inode->forwardsCompat == 0) {
|
| + }
|
| + if (cctxt->inode->forwardsCompat == 0) {
|
| /*
|
| * We are not in forwards-compatible mode, so raise an error.
|
| */
|
| @@ -4299,7 +4309,7 @@ xsltParseUnknownXSLTElem(xsltCompilerCtxtPtr cctxt,
|
| /*
|
| * Forwards-compatible mode.
|
| * ------------------------
|
| - *
|
| + *
|
| * Parse/compile xsl:fallback elements.
|
| *
|
| * QUESTION: Do we have to raise an error if there's no xsl:fallback?
|
| @@ -4342,7 +4352,7 @@ xsltParseUnknownXSLTElem(xsltCompilerCtxtPtr cctxt,
|
| }
|
| child = child->next;
|
| } while (child != NULL);
|
| -
|
| +
|
| xsltCompilerNodePop(cctxt, node);
|
| }
|
| return(0);
|
| @@ -4356,7 +4366,7 @@ xsltParseUnknownXSLTElem(xsltCompilerCtxtPtr cctxt,
|
| *
|
| * Parses a "template" content (or "sequence constructor" in XSLT 2.0 terms).
|
| * This will additionally remove xsl:text elements from the tree.
|
| - */
|
| + */
|
| void
|
| xsltParseSequenceConstructor(xsltCompilerCtxtPtr cctxt, xmlNodePtr cur)
|
| {
|
| @@ -4375,7 +4385,7 @@ xsltParseSequenceConstructor(xsltCompilerCtxtPtr cctxt, xmlNodePtr cur)
|
| if (cctxt->inode->category == XSLT_ELEMENT_CATEGORY_EXTENSION) {
|
| cctxt->inode->extContentHandled = 1;
|
| }
|
| - if (cur == NULL)
|
| + if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL))
|
| return;
|
| /*
|
| * This is the content reffered to as a "template".
|
| @@ -4396,14 +4406,14 @@ xsltParseSequenceConstructor(xsltCompilerCtxtPtr cctxt, xmlNodePtr cur)
|
| * xsl:choose, xsl:if, xsl:text, xsl:copy, xsl:variable,
|
| * xsl:message, xsl:fallback,
|
| * xsl:processing-instruction, xsl:comment, xsl:element
|
| - * xsl:attribute.
|
| + * xsl:attribute.
|
| * Additional allowed content:
|
| * 1) extension instructions
|
| * 2) literal result elements
|
| * 3) PCDATA
|
| *
|
| * NOTE that this content model does *not* allow xsl:param.
|
| - */
|
| + */
|
| while (cur != NULL) {
|
| if (deleteNode != NULL) {
|
| #ifdef WITH_XSLT_DEBUG_BLANKS
|
| @@ -4414,8 +4424,8 @@ xsltParseSequenceConstructor(xsltCompilerCtxtPtr cctxt, xmlNodePtr cur)
|
| xmlFreeNode(deleteNode);
|
| deleteNode = NULL;
|
| }
|
| - if (cur->type == XML_ELEMENT_NODE) {
|
| -
|
| + if (cur->type == XML_ELEMENT_NODE) {
|
| +
|
| if (cur->psvi == xsltXSLTTextMarker) {
|
| /*
|
| * xsl:text elements
|
| @@ -4452,7 +4462,7 @@ xsltParseSequenceConstructor(xsltCompilerCtxtPtr cctxt, xmlNodePtr cur)
|
| "Element 'xsl:text': Invalid type "
|
| "of node found in content.\n");
|
| cctxt->style->errors++;
|
| - }
|
| + }
|
| }
|
| if (cur->properties) {
|
| xmlAttrPtr attr;
|
| @@ -4503,7 +4513,7 @@ xsltParseSequenceConstructor(xsltCompilerCtxtPtr cctxt, xmlNodePtr cur)
|
| /*
|
| * TODO: Using the XSLT-marker is still not stable yet.
|
| */
|
| - /* if (cur->psvi == xsltXSLTElemMarker) { */
|
| + /* if (cur->psvi == xsltXSLTElemMarker) { */
|
| /*
|
| * XSLT instructions
|
| * --------------------------------------------------------
|
| @@ -4537,7 +4547,7 @@ xsltParseSequenceConstructor(xsltCompilerCtxtPtr cctxt, xmlNodePtr cur)
|
| xsltParseAnyXSLTElem(cctxt, cur);
|
| break;
|
| default:
|
| - xsltParseUnknownXSLTElem(cctxt, cur);
|
| + xsltParseUnknownXSLTElem(cctxt, cur);
|
| cur = cur->next;
|
| continue;
|
| }
|
| @@ -4613,7 +4623,7 @@ xsltParseSequenceConstructor(xsltCompilerCtxtPtr cctxt, xmlNodePtr cur)
|
| }
|
| cur->psvi = (void *)
|
| xsltPreComputeExtModuleElement(cctxt->style, cur);
|
| -
|
| +
|
| if (cur->psvi == NULL) {
|
| /*
|
| * OLD COMMENT: "Unknown element, maybe registered
|
| @@ -4685,7 +4695,7 @@ xsltParseSequenceConstructor(xsltCompilerCtxtPtr cctxt, xmlNodePtr cur)
|
| xsltParseAttrXSLTVersion(cctxt, cur,
|
| XSLT_ELEMENT_CATEGORY_LRE);
|
| /*
|
| - * Report invalid XSLT attributes.
|
| + * Report invalid XSLT attributes.
|
| * For XSLT 1.0 only xsl:use-attribute-sets is allowed
|
| * next to xsl:version, xsl:exclude-result-prefixes and
|
| * xsl:extension-element-prefixes.
|
| @@ -4696,10 +4706,10 @@ xsltParseSequenceConstructor(xsltCompilerCtxtPtr cctxt, xmlNodePtr cur)
|
| do {
|
| if ((attr->psvi != xsltXSLTAttrMarker) &&
|
| IS_XSLT_ATTR_FAST(attr))
|
| - {
|
| + {
|
| if (! xmlStrEqual(attr->name,
|
| BAD_CAST "use-attribute-sets"))
|
| - {
|
| + {
|
| xsltTransformError(NULL, cctxt->style,
|
| cur,
|
| "Unknown XSLT attribute '%s'.\n",
|
| @@ -4731,7 +4741,7 @@ xsltParseSequenceConstructor(xsltCompilerCtxtPtr cctxt, xmlNodePtr cur)
|
| */
|
| if (cur->properties) {
|
| xmlAttrPtr attr = cur->properties;
|
| -
|
| +
|
| while (attr != NULL) {
|
| xsltCompileAttr(cctxt->style, attr);
|
| attr = attr->next;
|
| @@ -4774,13 +4784,14 @@ xsltParseSequenceConstructor(xsltCompilerCtxtPtr cctxt, xmlNodePtr cur)
|
| * constructor" in XSLT 2.0); it it allows addional xsl:param
|
| * elements as immediate children of @templ.
|
| *
|
| - * Called by:
|
| + * Called by:
|
| * exsltFuncFunctionComp() (EXSLT, functions.c)
|
| * So this is intended to be called from extension functions.
|
| */
|
| void
|
| xsltParseTemplateContent(xsltStylesheetPtr style, xmlNodePtr templ) {
|
| - if ((style == NULL) || (templ == NULL))
|
| + if ((style == NULL) || (templ == NULL) ||
|
| + (templ->type == XML_NAMESPACE_DECL))
|
| return;
|
|
|
| /*
|
| @@ -4790,13 +4801,13 @@ xsltParseTemplateContent(xsltStylesheetPtr style, xmlNodePtr templ) {
|
| XSLT_CCTXT(style)->inode->extContentHandled = 1;
|
| }
|
|
|
| - if (templ->children != NULL) {
|
| + if (templ->children != NULL) {
|
| xmlNodePtr child = templ->children;
|
| /*
|
| * Process xsl:param elements, which can only occur as the
|
| * immediate children of xsl:template (well, and of any
|
| * user-defined extension instruction if needed).
|
| - */
|
| + */
|
| do {
|
| if ((child->type == XML_ELEMENT_NODE) &&
|
| IS_XSLT_ELEM_FAST(child) &&
|
| @@ -4829,6 +4840,10 @@ xsltParseTemplateContent(xsltStylesheetPtr style, xmlNodePtr templ) {
|
| void
|
| xsltParseTemplateContent(xsltStylesheetPtr style, xmlNodePtr templ) {
|
| xmlNodePtr cur, delete;
|
| +
|
| + if ((style == NULL) || (templ == NULL) ||
|
| + (templ->type == XML_NAMESPACE_DECL)) return;
|
| +
|
| /*
|
| * This content comes from the stylesheet
|
| * For stylesheets, the set of whitespace-preserving
|
| @@ -4859,7 +4874,7 @@ xsltParseTemplateContent(xsltStylesheetPtr style, xmlNodePtr templ) {
|
| xmlChar *prop;
|
| xmlNodePtr text = cur->children, next;
|
| int noesc = 0;
|
| -
|
| +
|
| prop = xmlGetNsProp(cur,
|
| (const xmlChar *)"disable-output-escaping",
|
| NULL);
|
| @@ -4912,7 +4927,7 @@ xsltParseTemplateContent(xsltStylesheetPtr style, xmlNodePtr templ) {
|
| */
|
| if (text->doc->dict != NULL) {
|
| const xmlChar *tmp;
|
| -
|
| +
|
| tmp = xmlDictLookup(text->doc->dict,
|
| text->content, -1);
|
| if (tmp != text->content) {
|
| @@ -4974,7 +4989,7 @@ skip_children:
|
| cur = cur->next;
|
| continue;
|
| }
|
| -
|
| +
|
| do {
|
| cur = cur->parent;
|
| if (cur == NULL)
|
| @@ -5048,7 +5063,7 @@ xsltParseStylesheetKey(xsltStylesheetPtr style, xmlNodePtr key) {
|
| xmlChar *name = NULL;
|
| xmlChar *nameURI = NULL;
|
|
|
| - if ((style == NULL) || (key == NULL))
|
| + if ((style == NULL) || (key == NULL) || (key->type != XML_ELEMENT_NODE))
|
| return;
|
|
|
| /*
|
| @@ -5135,10 +5150,11 @@ error:
|
| static void
|
| xsltParseXSLTTemplate(xsltCompilerCtxtPtr cctxt, xmlNodePtr templNode) {
|
| xsltTemplatePtr templ;
|
| - xmlChar *prop;
|
| - double priority;
|
| + xmlChar *prop;
|
| + double priority;
|
|
|
| - if ((cctxt == NULL) || (templNode == NULL))
|
| + if ((cctxt == NULL) || (templNode == NULL) ||
|
| + (templNode->type != XML_ELEMENT_NODE))
|
| return;
|
|
|
| /*
|
| @@ -5155,19 +5171,19 @@ xsltParseXSLTTemplate(xsltCompilerCtxtPtr cctxt, xmlNodePtr templNode) {
|
|
|
| templ->next = cctxt->style->templates;
|
| cctxt->style->templates = templ;
|
| - templ->style = cctxt->style;
|
| + templ->style = cctxt->style;
|
|
|
| /*
|
| * Attribute "mode".
|
| */
|
| prop = xmlGetNsProp(templNode, (const xmlChar *)"mode", NULL);
|
| - if (prop != NULL) {
|
| + if (prop != NULL) {
|
| const xmlChar *modeURI;
|
|
|
| /*
|
| * TODO: We need a standardized function for extraction
|
| * of namespace names and local names from QNames.
|
| - * Don't use xsltGetQNameURI() as it cannot channel
|
| + * Don't use xsltGetQNameURI() as it cannot channe�
|
| * reports through the context.
|
| */
|
| modeURI = xsltGetQNameURI(templNode, &prop);
|
| @@ -5217,7 +5233,7 @@ xsltParseXSLTTemplate(xsltCompilerCtxtPtr cctxt, xmlNodePtr templNode) {
|
| if (prop != NULL) {
|
| const xmlChar *nameURI;
|
| xsltTemplatePtr curTempl;
|
| -
|
| +
|
| /*
|
| * TODO: Don't use xsltGetQNameURI().
|
| */
|
| @@ -5235,7 +5251,7 @@ xsltParseXSLTTemplate(xsltCompilerCtxtPtr cctxt, xmlNodePtr templNode) {
|
| "the value is not a valid NCName.\n", templ->name);
|
| cctxt->style->errors++;
|
| goto error;
|
| - }
|
| + }
|
| if (nameURI != NULL)
|
| templ->nameURI = xmlDictLookup(cctxt->style->dict, nameURI, -1);
|
| curTempl = templ->next;
|
| @@ -5254,7 +5270,7 @@ xsltParseXSLTTemplate(xsltCompilerCtxtPtr cctxt, xmlNodePtr templNode) {
|
| }
|
| }
|
| if (templNode->children != NULL) {
|
| - xsltParseTemplateContent(cctxt->style, templNode);
|
| + xsltParseTemplateContent(cctxt->style, templNode);
|
| /*
|
| * MAYBE TODO: Custom behaviour: In order to stay compatible with
|
| * Xalan and MSXML(.NET), we could allow whitespace
|
| @@ -5269,9 +5285,9 @@ xsltParseXSLTTemplate(xsltCompilerCtxtPtr cctxt, xmlNodePtr templNode) {
|
| * <xsl:param name="zoo"/>
|
| * ... the whitespace between every xsl:param would be
|
| * added to the result tree.
|
| - */
|
| - }
|
| -
|
| + */
|
| + }
|
| +
|
| templ->elem = templNode;
|
| templ->content = templNode->children;
|
| xsltAddTemplate(cctxt->style, templ, templ->mode, templ->modeURI);
|
| @@ -5299,7 +5315,8 @@ xsltParseStylesheetTemplate(xsltStylesheetPtr style, xmlNodePtr template) {
|
| xmlChar *modeURI = NULL;
|
| double priority;
|
|
|
| - if (template == NULL)
|
| + if ((style == NULL) || (template == NULL) ||
|
| + (template->type != XML_ELEMENT_NODE))
|
| return;
|
|
|
| /*
|
| @@ -5311,7 +5328,7 @@ xsltParseStylesheetTemplate(xsltStylesheetPtr style, xmlNodePtr template) {
|
| ret->next = style->templates;
|
| style->templates = ret;
|
| ret->style = style;
|
| -
|
| +
|
| /*
|
| * Get inherited namespaces
|
| */
|
| @@ -5366,7 +5383,7 @@ xsltParseStylesheetTemplate(xsltStylesheetPtr style, xmlNodePtr template) {
|
| if (prop != NULL) {
|
| const xmlChar *URI;
|
| xsltTemplatePtr cur;
|
| -
|
| +
|
| /*
|
| * TODO: Don't use xsltGetQNameURI().
|
| */
|
| @@ -5431,7 +5448,7 @@ static xsltStyleItemIncludePtr
|
| xsltCompileXSLTIncludeElem(xsltCompilerCtxtPtr cctxt, xmlNodePtr node) {
|
| xsltStyleItemIncludePtr item;
|
|
|
| - if ((cctxt == NULL) || (node == NULL))
|
| + if ((cctxt == NULL) || (node == NULL) || (node->type != XML_ELEMENT_NODE))
|
| return(NULL);
|
|
|
| node->psvi = NULL;
|
| @@ -5462,7 +5479,7 @@ xsltParseFindTopLevelElem(xsltCompilerCtxtPtr cctxt,
|
| xmlNodePtr cur,
|
| const xmlChar *name,
|
| const xmlChar *namespaceURI,
|
| - int breakOnOtherElem,
|
| + int breakOnOtherElem,
|
| xmlNodePtr *resultNode)
|
| {
|
| if (name == NULL)
|
| @@ -5474,7 +5491,7 @@ xsltParseFindTopLevelElem(xsltCompilerCtxtPtr cctxt,
|
| if ((cur->ns != NULL) && (cur->name != NULL)) {
|
| if ((*(cur->name) == *name) &&
|
| xmlStrEqual(cur->name, name) &&
|
| - xmlStrEqual(cur->ns->href, namespaceURI))
|
| + xmlStrEqual(cur->ns->href, namespaceURI))
|
| {
|
| *resultNode = cur;
|
| return(1);
|
| @@ -5517,13 +5534,13 @@ xsltParseTopLevelXSLTElem(xsltCompilerCtxtPtr cctxt,
|
| int oldIsInclude;
|
|
|
| if (xsltCompileXSLTIncludeElem(cctxt, node) == NULL)
|
| - goto exit;
|
| + goto exit;
|
| /*
|
| * Mark this stylesheet tree as being currently included.
|
| */
|
| oldIsInclude = cctxt->isInclude;
|
| cctxt->isInclude = 1;
|
| -
|
| +
|
| if (xsltParseStylesheetInclude(cctxt->style, node) != 0) {
|
| cctxt->style->errors++;
|
| }
|
| @@ -5573,7 +5590,7 @@ xsltParseRemoveWhitespace(xmlNodePtr node)
|
| if (((child->type == XML_TEXT_NODE) ||
|
| (child->type == XML_CDATA_SECTION_NODE)) &&
|
| (IS_BLANK_NODE(child)))
|
| - delNode = child;
|
| + delNode = child;
|
| child = child->next;
|
| } while (child != NULL);
|
| if (delNode) {
|
| @@ -5597,9 +5614,9 @@ xsltParseXSLTStylesheetElemCore(xsltCompilerCtxtPtr cctxt, xmlNodePtr node)
|
|
|
| if ((cctxt == NULL) || (node == NULL) ||
|
| (node->type != XML_ELEMENT_NODE))
|
| - return(-1);
|
| + return(-1);
|
|
|
| - style = cctxt->style;
|
| + style = cctxt->style;
|
| /*
|
| * At this stage all import declarations of all stylesheet modules
|
| * with the same stylesheet level have been processed.
|
| @@ -5630,13 +5647,13 @@ xsltParseXSLTStylesheetElemCore(xsltCompilerCtxtPtr cctxt, xmlNodePtr node)
|
| if (node == NULL) {
|
| return(-1);
|
| }
|
| - }
|
| -
|
| + }
|
| +
|
| if (node->children == NULL)
|
| return(0);
|
| /*
|
| * Push the xsl:stylesheet/xsl:transform element.
|
| - */
|
| + */
|
| xsltCompilerNodePush(cctxt, node);
|
| cctxt->inode->isRoot = 1;
|
| cctxt->inode->nsChanged = 0;
|
| @@ -5651,7 +5668,7 @@ xsltParseXSLTStylesheetElemCore(xsltCompilerCtxtPtr cctxt, xmlNodePtr node)
|
| * stylesheet is rooted at, regardless if it's an XSLT
|
| * instruction or a literal result instruction (or if
|
| * this is an embedded stylesheet).
|
| - */
|
| + */
|
| cctxt->inode->inScopeNs =
|
| xsltCompilerBuildInScopeNsList(cctxt, node);
|
|
|
| @@ -5662,11 +5679,11 @@ xsltParseXSLTStylesheetElemCore(xsltCompilerCtxtPtr cctxt, xmlNodePtr node)
|
| * id = id
|
| * extension-element-prefixes = tokens
|
| * exclude-result-prefixes = tokens
|
| - * version = number (mandatory)
|
| + * version = number (mandatory)
|
| */
|
| if (xsltParseAttrXSLTVersion(cctxt, node,
|
| XSLT_ELEMENT_CATEGORY_XSLT) == 0)
|
| - {
|
| + {
|
| /*
|
| * Attribute "version".
|
| * XSLT 1.0: "An xsl:stylesheet element *must* have a version
|
| @@ -5679,21 +5696,21 @@ xsltParseXSLTStylesheetElemCore(xsltCompilerCtxtPtr cctxt, xmlNodePtr node)
|
| if (isXsltElem)
|
| xsltTransformError(NULL, cctxt->style, node,
|
| "The attribute 'version' is missing.\n");
|
| - cctxt->style->errors++;
|
| + cctxt->style->errors++;
|
| #else
|
| /* OLD behaviour. */
|
| xsltTransformError(NULL, cctxt->style, node,
|
| "xsl:version is missing: document may not be a stylesheet\n");
|
| cctxt->style->warnings++;
|
| #endif
|
| - }
|
| + }
|
| /*
|
| * The namespaces declared by the attributes
|
| * "extension-element-prefixes" and
|
| * "exclude-result-prefixes" are local to *this*
|
| * stylesheet tree; i.e., they are *not* visible to
|
| * other stylesheet-modules, whether imported or included.
|
| - *
|
| + *
|
| * Attribute "extension-element-prefixes".
|
| */
|
| cctxt->inode->extElemNs =
|
| @@ -5764,9 +5781,9 @@ xsltParseXSLTStylesheetElemCore(xsltCompilerCtxtPtr cctxt, xmlNodePtr node)
|
| xsltParseFindTopLevelElem(cctxt, cur,
|
| BAD_CAST "param", XSLT_NAMESPACE, 0, &cur) == 1)
|
| {
|
| - xsltParseTopLevelXSLTElem(cctxt, cur, XSLT_FUNC_PARAM);
|
| + xsltParseTopLevelXSLTElem(cctxt, cur, XSLT_FUNC_PARAM);
|
| cur = cur->next;
|
| - }
|
| + }
|
| /*
|
| * Process all top-level xsl:variable elements.
|
| */
|
| @@ -5777,16 +5794,16 @@ xsltParseXSLTStylesheetElemCore(xsltCompilerCtxtPtr cctxt, xmlNodePtr node)
|
| {
|
| xsltParseTopLevelXSLTElem(cctxt, cur, XSLT_FUNC_VARIABLE);
|
| cur = cur->next;
|
| - }
|
| + }
|
| /*
|
| * Process all the rest of top-level elements.
|
| */
|
| cur = start;
|
| - while (cur != NULL) {
|
| + while (cur != NULL) {
|
| /*
|
| * Process element nodes.
|
| */
|
| - if (cur->type == XML_ELEMENT_NODE) {
|
| + if (cur->type == XML_ELEMENT_NODE) {
|
| if (cur->ns == NULL) {
|
| xsltTransformError(NULL, style, cur,
|
| "Unexpected top-level element in no namespace.\n");
|
| @@ -5808,7 +5825,7 @@ xsltParseXSLTStylesheetElemCore(xsltCompilerCtxtPtr cctxt, xmlNodePtr node)
|
| cur = cur->next;
|
| continue;
|
| }
|
| - /*
|
| + /*
|
| * TODO: Change the return type of the parsing functions
|
| * to int.
|
| */
|
| @@ -5826,8 +5843,8 @@ xsltParseXSLTStylesheetElemCore(xsltCompilerCtxtPtr cctxt, xmlNodePtr node)
|
| /* NOP; done already */
|
| } else if (IS_XSLT_NAME(cur, "param")) {
|
| /* NOP; done already */
|
| - } else if (IS_XSLT_NAME(cur, "include")) {
|
| - if (cur->psvi != NULL)
|
| + } else if (IS_XSLT_NAME(cur, "include")) {
|
| + if (cur->psvi != NULL)
|
| xsltParseXSLTStylesheetElemCore(cctxt, cur);
|
| else {
|
| xsltTransformError(NULL, style, cur,
|
| @@ -5849,13 +5866,13 @@ xsltParseXSLTStylesheetElemCore(xsltCompilerCtxtPtr cctxt, xmlNodePtr node)
|
| /* TODO: node-info needed for expressions ? */
|
| xsltParseStylesheetKey(style, cur);
|
| } else if (IS_XSLT_NAME(cur, "decimal-format")) {
|
| - /* No node-info needed. */
|
| + /* No node-info needed. */
|
| xsltParseStylesheetDecimalFormat(style, cur);
|
| - } else if (IS_XSLT_NAME(cur, "attribute-set")) {
|
| + } else if (IS_XSLT_NAME(cur, "attribute-set")) {
|
| xsltParseTopLevelXSLTElem(cctxt, cur,
|
| - XSLT_FUNC_ATTRSET);
|
| + XSLT_FUNC_ATTRSET);
|
| } else if (IS_XSLT_NAME(cur, "namespace-alias")) {
|
| - /* NOP; done already */
|
| + /* NOP; done already */
|
| } else {
|
| if (cctxt->inode->forwardsCompat) {
|
| /*
|
| @@ -5929,7 +5946,7 @@ exit:
|
| * @cctxt: the compiler context
|
| * @node: the xsl:stylesheet/xsl:transform element-node
|
| *
|
| - * Parses the xsl:stylesheet and xsl:transform element.
|
| + * Parses the xsl:stylesheet and xsl:transform element.
|
| *
|
| * <xsl:stylesheet
|
| * id = id
|
| @@ -5940,7 +5957,7 @@ exit:
|
| * </xsl:stylesheet>
|
| *
|
| * BIG TODO: The xsl:include stuff.
|
| - *
|
| + *
|
| * Called by xsltParseStylesheetTree()
|
| *
|
| * Returns 0 on success, a positive result on errors and
|
| @@ -5951,9 +5968,9 @@ xsltParseXSLTStylesheetElem(xsltCompilerCtxtPtr cctxt, xmlNodePtr node)
|
| {
|
| xmlNodePtr cur, start;
|
|
|
| - if ((cctxt == NULL) || (node == NULL))
|
| + if ((cctxt == NULL) || (node == NULL) || (node->type != XML_ELEMENT_NODE))
|
| return(-1);
|
| -
|
| +
|
| if (node->children == NULL)
|
| goto exit;
|
|
|
| @@ -5968,7 +5985,7 @@ xsltParseXSLTStylesheetElem(xsltCompilerCtxtPtr cctxt, xmlNodePtr node)
|
| * XSLT 1.0: "The xsl:import element children must precede all
|
| * other element children of an xsl:stylesheet element,
|
| * including any xsl:include element children."
|
| - */
|
| + */
|
| while ((cur != NULL) &&
|
| xsltParseFindTopLevelElem(cctxt, cur,
|
| BAD_CAST "import", XSLT_NAMESPACE, 1, &cur) == 1)
|
| @@ -6009,14 +6026,14 @@ xsltParseXSLTStylesheetElem(xsltCompilerCtxtPtr cctxt, xmlNodePtr node)
|
| if (cctxt->isInclude) {
|
| /*
|
| * If this stylesheet is intended for inclusion, then
|
| - * we will process only imports and includes.
|
| + * we will process only imports and includes.
|
| */
|
| goto exit;
|
| - }
|
| + }
|
| /*
|
| * Now parse the rest of the top-level elements.
|
| */
|
| - xsltParseXSLTStylesheetElemCore(cctxt, node);
|
| + xsltParseXSLTStylesheetElemCore(cctxt, node);
|
| exit:
|
|
|
| return(0);
|
| @@ -6039,7 +6056,7 @@ xsltParseStylesheetTop(xsltStylesheetPtr style, xmlNodePtr top) {
|
| int templates = 0;
|
| #endif
|
|
|
| - if (top == NULL)
|
| + if ((top == NULL) || (top->type != XML_ELEMENT_NODE))
|
| return;
|
|
|
| prop = xmlGetNsProp(top, (const xmlChar *)"version", NULL);
|
| @@ -6052,8 +6069,10 @@ xsltParseStylesheetTop(xsltStylesheetPtr style, xmlNodePtr top) {
|
| (!xmlStrEqual(prop, (const xmlChar *)"1.1"))) {
|
| xsltTransformError(NULL, style, top,
|
| "xsl:version: only 1.0 features are supported\n");
|
| - /* TODO set up compatibility when not XSLT 1.0 */
|
| - if (style != NULL) style->warnings++;
|
| + if (style != NULL) {
|
| + style->forwards_compatible = 1;
|
| + style->warnings++;
|
| + }
|
| }
|
| xmlFree(prop);
|
| }
|
| @@ -6147,12 +6166,7 @@ xsltParseStylesheetTop(xsltStylesheetPtr style, xmlNodePtr top) {
|
| } else if (IS_XSLT_NAME(cur, "namespace-alias")) {
|
| xsltNamespaceAlias(style, cur);
|
| } else {
|
| - /*
|
| - * BUG TODO: The version of the *doc* is irrelevant for
|
| - * the forwards-compatible mode.
|
| - */
|
| - if ((style != NULL) && (style->doc->version != NULL) &&
|
| - (!strncmp((const char *) style->doc->version, "1.0", 3))) {
|
| + if ((style != NULL) && (style->forwards_compatible == 0)) {
|
| xsltTransformError(NULL, style, cur,
|
| "xsltParseStylesheetTop: unknown %s element\n",
|
| cur->name);
|
| @@ -6193,7 +6207,7 @@ xsltParseSimplifiedStylesheetTree(xsltCompilerCtxtPtr cctxt,
|
| xmlNodePtr node)
|
| {
|
| xsltTemplatePtr templ;
|
| -
|
| +
|
| if ((cctxt == NULL) || (node == NULL))
|
| return(-1);
|
|
|
| @@ -6209,12 +6223,12 @@ xsltParseSimplifiedStylesheetTree(xsltCompilerCtxtPtr cctxt,
|
| cctxt->style->errors++;
|
| return(1);
|
| }
|
| -
|
| +
|
| #ifdef WITH_XSLT_DEBUG_PARSING
|
| xsltGenericDebug(xsltGenericDebugContext,
|
| "xsltParseSimplifiedStylesheetTree: document is stylesheet\n");
|
| -#endif
|
| -
|
| +#endif
|
| +
|
| /*
|
| * Create and link the template
|
| */
|
| @@ -6270,12 +6284,12 @@ xsltRestoreDocumentNamespaces(xsltNsMapPtr ns, xmlDocPtr doc)
|
| /*
|
| * Revert the changes we have applied to the namespace-URIs of
|
| * ns-decls.
|
| - */
|
| + */
|
| while (ns != NULL) {
|
| if ((ns->doc == doc) && (ns->ns != NULL)) {
|
| ns->ns->href = ns->origNsName;
|
| ns->origNsName = NULL;
|
| - ns->ns = NULL;
|
| + ns->ns = NULL;
|
| }
|
| ns = ns->next;
|
| }
|
| @@ -6318,9 +6332,9 @@ xsltParseStylesheetProcess(xsltStylesheetPtr style, xmlDocPtr doc)
|
| }
|
| oldIsSimplifiedStylesheet = cctxt->simplified;
|
|
|
| - if ((IS_XSLT_ELEM(cur)) &&
|
| + if ((IS_XSLT_ELEM(cur)) &&
|
| ((IS_XSLT_NAME(cur, "stylesheet")) ||
|
| - (IS_XSLT_NAME(cur, "transform")))) {
|
| + (IS_XSLT_NAME(cur, "transform")))) {
|
| #ifdef WITH_XSLT_DEBUG_PARSING
|
| xsltGenericDebug(xsltGenericDebugContext,
|
| "xsltParseStylesheetProcess : found stylesheet\n");
|
| @@ -6347,7 +6361,7 @@ xsltParseStylesheetProcess(xsltStylesheetPtr style, xmlDocPtr doc)
|
| } else {
|
| if (xsltParseSimplifiedStylesheetTree(cctxt, doc, cur) != 0)
|
| return(NULL);
|
| - }
|
| + }
|
|
|
| cctxt->simplified = oldIsSimplifiedStylesheet;
|
|
|
| @@ -6379,7 +6393,7 @@ xsltParseStylesheetProcess(xsltStylesheetPtr ret, xmlDocPtr doc) {
|
| return(NULL);
|
| if (ret == NULL)
|
| return(ret);
|
| -
|
| +
|
| /*
|
| * First steps, remove blank nodes,
|
| * locate the xsl:stylesheet element and the
|
| @@ -6392,9 +6406,9 @@ xsltParseStylesheetProcess(xsltStylesheetPtr ret, xmlDocPtr doc) {
|
| return(NULL);
|
| }
|
|
|
| - if ((IS_XSLT_ELEM(cur)) &&
|
| + if ((IS_XSLT_ELEM(cur)) &&
|
| ((IS_XSLT_NAME(cur, "stylesheet")) ||
|
| - (IS_XSLT_NAME(cur, "transform")))) {
|
| + (IS_XSLT_NAME(cur, "transform")))) {
|
| #ifdef WITH_XSLT_DEBUG_PARSING
|
| xsltGenericDebug(xsltGenericDebugContext,
|
| "xsltParseStylesheetProcess : found stylesheet\n");
|
| @@ -6430,7 +6444,7 @@ xsltParseStylesheetProcess(xsltStylesheetPtr ret, xmlDocPtr doc) {
|
| xsltGenericDebug(xsltGenericDebugContext,
|
| "xsltParseStylesheetProcess : document is stylesheet\n");
|
| #endif
|
| -
|
| +
|
| if (!xmlStrEqual(prop, (const xmlChar *)"1.0")) {
|
| xsltTransformError(NULL, ret, cur,
|
| "xsl:version: only 1.0 features are supported\n");
|
| @@ -6457,7 +6471,7 @@ xsltParseStylesheetProcess(xsltStylesheetPtr ret, xmlDocPtr doc) {
|
| template->elem = (xmlNodePtr) doc;
|
| template->content = doc->children;
|
| xsltAddTemplate(ret, template, NULL, NULL);
|
| - ret->literal_result = 1;
|
| + ret->literal_result = 1;
|
| }
|
|
|
| return(ret);
|
| @@ -6503,8 +6517,8 @@ xsltParseStylesheetImportedDoc(xmlDocPtr doc,
|
| doc->URL);
|
| #endif
|
| xmlDictReference(retStyle->dict);
|
| - }
|
| -
|
| + }
|
| +
|
| /*
|
| * TODO: Eliminate xsltGatherNamespaces(); we must not restrict
|
| * the stylesheet to containt distinct namespace prefixes.
|
| @@ -6515,7 +6529,7 @@ xsltParseStylesheetImportedDoc(xmlDocPtr doc,
|
| {
|
| xsltCompilerCtxtPtr cctxt;
|
| xsltStylesheetPtr oldCurSheet;
|
| -
|
| +
|
| if (parentStyle == NULL) {
|
| xsltPrincipalStylesheetDataPtr principalData;
|
| /*
|
| @@ -6543,7 +6557,7 @@ xsltParseStylesheetImportedDoc(xmlDocPtr doc,
|
| if (cctxt == NULL) {
|
| xsltFreeStylesheet(retStyle);
|
| return(NULL);
|
| - }
|
| + }
|
| retStyle->compCtxt = (void *) cctxt;
|
| cctxt->style = retStyle;
|
| cctxt->dict = retStyle->dict;
|
| @@ -6567,10 +6581,10 @@ xsltParseStylesheetImportedDoc(xmlDocPtr doc,
|
| */
|
| oldCurSheet = cctxt->style;
|
| cctxt->style = retStyle;
|
| -
|
| +
|
| retStyle->doc = doc;
|
| xsltParseStylesheetProcess(retStyle, doc);
|
| -
|
| +
|
| cctxt->style = oldCurSheet;
|
| if (parentStyle == NULL) {
|
| /*
|
| @@ -6594,7 +6608,7 @@ xsltParseStylesheetImportedDoc(xmlDocPtr doc,
|
| /*
|
| * Restore all changes made to namespace URIs of ns-decls.
|
| */
|
| - if (cctxt->psData->nsMap)
|
| + if (cctxt->psData->nsMap)
|
| xsltRestoreDocumentNamespaces(cctxt->psData->nsMap, doc);
|
| #endif
|
| /*
|
| @@ -6607,7 +6621,7 @@ xsltParseStylesheetImportedDoc(xmlDocPtr doc,
|
| */
|
| if (parentStyle == NULL) {
|
| xsltCleanupStylesheetTree(doc, xmlDocGetRootElement(doc));
|
| - if (retStyle->compCtxt != NULL) {
|
| + if (retStyle->compCtxt != NULL) {
|
| xsltCompilationCtxtFree(retStyle->compCtxt);
|
| retStyle->compCtxt = NULL;
|
| }
|
| @@ -6618,7 +6632,7 @@ xsltParseStylesheetImportedDoc(xmlDocPtr doc,
|
| }
|
| }
|
| }
|
| -
|
| +
|
| #else /* XSLT_REFACTORED */
|
| /*
|
| * Old behaviour.
|
| @@ -6640,7 +6654,7 @@ xsltParseStylesheetImportedDoc(xmlDocPtr doc,
|
| }
|
| }
|
| #endif /* else of XSLT_REFACTORED */
|
| -
|
| +
|
| return(retStyle);
|
| }
|
|
|
| @@ -6696,7 +6710,7 @@ xsltParseStylesheetFile(const xmlChar* filename) {
|
| xsltSecurityPrefsPtr sec;
|
| xsltStylesheetPtr ret;
|
| xmlDocPtr doc;
|
| -
|
| +
|
| xsltInitGlobals();
|
|
|
| if (filename == NULL)
|
| @@ -6795,7 +6809,7 @@ xsltParseStylesheetPI(const xmlChar *value) {
|
| continue;
|
| val = xmlStrndup(start, cur - start);
|
| NEXT;
|
| - if (val == NULL)
|
| + if (val == NULL)
|
| return(NULL);
|
| if ((xmlStrcasecmp(val, BAD_CAST "text/xml")) &&
|
| (xmlStrcasecmp(val, BAD_CAST "text/xsl"))) {
|
| @@ -6827,7 +6841,7 @@ xsltParseStylesheetPI(const xmlChar *value) {
|
| while ((CUR != 0) && (!IS_BLANK(CUR)))
|
| NEXT;
|
| }
|
| -
|
| +
|
| }
|
|
|
| if (!isXml) {
|
| @@ -6843,7 +6857,7 @@ xsltParseStylesheetPI(const xmlChar *value) {
|
| * @doc: a document to process
|
| *
|
| * This function tries to locate the stylesheet PI in the given document
|
| - * If found, and if contained within the document, it will extract
|
| + * If found, and if contained within the document, it will extract
|
| * that subtree to build the stylesheet to process @doc (doc itself will
|
| * be modified). If found but referencing an external document it will
|
| * attempt to load it and generate a stylesheet from it. In both cases,
|
|
|