| Index: third_party/libxslt/libxslt/xslt.c
|
| ===================================================================
|
| --- third_party/libxslt/libxslt/xslt.c (revision 39981)
|
| +++ third_party/libxslt/libxslt/xslt.c (working copy)
|
| @@ -56,6 +56,10 @@
|
|
|
| const xmlChar *xsltConstNamespaceNameXSLT = (const xmlChar *) XSLT_NAMESPACE;
|
|
|
| +#define XSLT_ELEMENT_CATEGORY_XSLT 0
|
| +#define XSLT_ELEMENT_CATEGORY_EXTENSION 1
|
| +#define XSLT_ELEMENT_CATEGORY_LRE 2
|
| +
|
| /*
|
| * xsltLiteralResultMarker:
|
| * Marker for Literal result elements, in order to avoid multiple attempts
|
| @@ -83,6 +87,9 @@
|
|
|
| #endif
|
|
|
| +#ifdef XSLT_LOCALE_WINAPI
|
| +extern xmlRMutexPtr xsltLocaleMutex;
|
| +#endif
|
| /*
|
| * Harmless but avoiding a problem when compiling against a
|
| * libxml <= 2.3.11 without LIBXML_DEBUG_ENABLED
|
| @@ -141,11 +148,14 @@
|
| *
|
| * Push an excluded namespace name on the stack
|
| *
|
| - * Returns the new index in the stack or 0 in case of error
|
| + * Returns the new index in the stack or -1 if already present or
|
| + * in case of error
|
| */
|
| static int
|
| exclPrefixPush(xsltStylesheetPtr style, xmlChar * value)
|
| {
|
| + int i;
|
| +
|
| if (style->exclPrefixMax == 0) {
|
| style->exclPrefixMax = 4;
|
| style->exclPrefixTab =
|
| @@ -153,9 +163,14 @@
|
| sizeof(style->exclPrefixTab[0]));
|
| if (style->exclPrefixTab == NULL) {
|
| xmlGenericError(xmlGenericErrorContext, "malloc failed !\n");
|
| - return (0);
|
| + return (-1);
|
| }
|
| }
|
| + /* do not push duplicates */
|
| + for (i = 0;i < style->exclPrefixNr;i++) {
|
| + if (xmlStrEqual(style->exclPrefixTab[i], value))
|
| + return(-1);
|
| + }
|
| if (style->exclPrefixNr >= style->exclPrefixMax) {
|
| style->exclPrefixMax *= 2;
|
| style->exclPrefixTab =
|
| @@ -164,7 +179,7 @@
|
| sizeof(style->exclPrefixTab[0]));
|
| if (style->exclPrefixTab == NULL) {
|
| xmlGenericError(xmlGenericErrorContext, "realloc failed !\n");
|
| - return (0);
|
| + return (-1);
|
| }
|
| }
|
| style->exclPrefixTab[style->exclPrefixNr] = value;
|
| @@ -214,6 +229,9 @@
|
| xsltInit (void) {
|
| if (initialized == 0) {
|
| initialized = 1;
|
| +#ifdef XSLT_LOCALE_WINAPI
|
| + xsltLocaleMutex = xmlNewRMutex();
|
| +#endif
|
| xsltRegisterAllExtras();
|
| }
|
| }
|
| @@ -1704,12 +1722,13 @@
|
| prefix);
|
| if (style != NULL) style->warnings++;
|
| } else {
|
| + if (exclPrefixPush(style, (xmlChar *) ns->href) >= 0) {
|
| #ifdef WITH_XSLT_DEBUG_PARSING
|
| - xsltGenericDebug(xsltGenericDebugContext,
|
| - "exclude result prefix %s\n", prefix);
|
| + xsltGenericDebug(xsltGenericDebugContext,
|
| + "exclude result prefix %s\n", prefix);
|
| #endif
|
| - exclPrefixPush(style, (xmlChar *) ns->href);
|
| - nb++;
|
| + nb++;
|
| + }
|
| }
|
| xmlFree(prefix);
|
| }
|
| @@ -4921,13 +4940,14 @@
|
| * okay this is an extension element compile it too
|
| */
|
| xsltStylePreCompute(style, cur);
|
| - } else {
|
| + }
|
| + else if (cur->type == XML_ELEMENT_NODE)
|
| + {
|
| /*
|
| * This is an element which will be output as part of the
|
| * template exectution, precompile AVT if found.
|
| */
|
| - if ((cur->ns == NULL) && (style->defaultAlias != NULL) &&
|
| - (cur->type == XML_ELEMENT_NODE)) {
|
| + if ((cur->ns == NULL) && (style->defaultAlias != NULL)) {
|
| cur->ns = xmlSearchNsByHref(cur->doc, cur,
|
| style->defaultAlias);
|
| }
|
| @@ -6233,6 +6253,15 @@
|
| }
|
|
|
| #ifdef XSLT_REFACTORED_XSLT_NSCOMP
|
| +/**
|
| + * xsltRestoreDocumentNamespaces:
|
| + * @ns: map of namespaces
|
| + * @doc: the document
|
| + *
|
| + * Restore the namespaces for the document
|
| + *
|
| + * Returns 0 in case of success, -1 in case of failure
|
| + */
|
| int
|
| xsltRestoreDocumentNamespaces(xsltNsMapPtr ns, xmlDocPtr doc)
|
| {
|
| @@ -6274,6 +6303,7 @@
|
| xmlNodePtr cur;
|
| int oldIsSimplifiedStylesheet;
|
|
|
| + xsltInitGlobals();
|
|
|
| if ((style == NULL) || (doc == NULL))
|
| return(NULL);
|
| @@ -6326,10 +6356,25 @@
|
|
|
| #else /* XSLT_REFACTORED */
|
|
|
| +/**
|
| + * xsltParseStylesheetProcess:
|
| + * @ret: the XSLT stylesheet (the current stylesheet-level)
|
| + * @doc: and xmlDoc parsed XML
|
| + *
|
| + * Parses an XSLT stylesheet, adding the associated structures.
|
| + * Called by:
|
| + * xsltParseStylesheetImportedDoc() (xslt.c)
|
| + * xsltParseStylesheetInclude() (imports.c)
|
| + *
|
| + * Returns the value of the @style parameter if everything
|
| + * went right, NULL if something went amiss.
|
| + */
|
| xsltStylesheetPtr
|
| xsltParseStylesheetProcess(xsltStylesheetPtr ret, xmlDocPtr doc) {
|
| xmlNodePtr cur;
|
|
|
| + xsltInitGlobals();
|
| +
|
| if (doc == NULL)
|
| return(NULL);
|
| if (ret == NULL)
|
| @@ -6616,6 +6661,8 @@
|
| xsltParseStylesheetDoc(xmlDocPtr doc) {
|
| xsltStylesheetPtr ret;
|
|
|
| + xsltInitGlobals();
|
| +
|
| ret = xsltParseStylesheetImportedDoc(doc, NULL);
|
| if (ret == NULL)
|
| return(NULL);
|
| @@ -6650,6 +6697,7 @@
|
| xsltStylesheetPtr ret;
|
| xmlDocPtr doc;
|
|
|
| + xsltInitGlobals();
|
|
|
| if (filename == NULL)
|
| return(NULL);
|
| @@ -6811,6 +6859,8 @@
|
| xmlChar *href = NULL;
|
| xmlURIPtr URI;
|
|
|
| + xsltInitGlobals();
|
| +
|
| if (doc == NULL)
|
| return(NULL);
|
|
|
| @@ -6862,8 +6912,14 @@
|
| "xml-stylesheet : no ID %s found\n", URI->fragment);
|
| } else {
|
| xmlDocPtr fake;
|
| - xmlNodePtr subtree;
|
| + xmlNodePtr subtree, newtree;
|
| + xmlNsPtr ns;
|
|
|
| +#ifdef WITH_XSLT_DEBUG
|
| + xsltGenericDebug(xsltGenericDebugContext,
|
| + "creating new document from %s for embedded stylesheet\n",
|
| + doc->URL);
|
| +#endif
|
| /*
|
| * move the subtree in a new document passed to
|
| * the stylesheet analyzer
|
| @@ -6871,20 +6927,38 @@
|
| subtree = ID->parent;
|
| fake = xmlNewDoc(NULL);
|
| if (fake != NULL) {
|
| - /*
|
| - * the dictionary should be shared since nodes are
|
| - * moved over.
|
| - */
|
| + /*
|
| + * Should the dictionary still be shared even though
|
| + * the nodes are being copied rather than moved?
|
| + */
|
| fake->dict = doc->dict;
|
| xmlDictReference(doc->dict);
|
| #ifdef WITH_XSLT_DEBUG
|
| xsltGenericDebug(xsltGenericDebugContext,
|
| - "reusing dictionary from %s for stylesheet\n",
|
| - doc->URL);
|
| + "reusing dictionary from %s for embedded stylesheet\n",
|
| + doc->URL);
|
| #endif
|
|
|
| - xmlUnlinkNode(subtree);
|
| - xmlAddChild((xmlNodePtr) fake, subtree);
|
| + newtree = xmlDocCopyNode(subtree, fake, 1);
|
| +
|
| + fake->URL = xmlNodeGetBase(doc, subtree->parent);
|
| +#ifdef WITH_XSLT_DEBUG
|
| + xsltGenericDebug(xsltGenericDebugContext,
|
| + "set base URI for embedded stylesheet as %s\n",
|
| + fake->URL);
|
| +#endif
|
| +
|
| + /*
|
| + * Add all namespaces in scope of embedded stylesheet to
|
| + * root element of newly created stylesheet document
|
| + */
|
| + while ((subtree = subtree->parent) != (xmlNodePtr)doc) {
|
| + for (ns = subtree->ns; ns; ns = ns->next) {
|
| + xmlNewNs(newtree, ns->href, ns->prefix);
|
| + }
|
| + }
|
| +
|
| + xmlAddChild((xmlNodePtr)fake, newtree);
|
| ret = xsltParseStylesheetDoc(fake);
|
| if (ret == NULL)
|
| xmlFreeDoc(fake);
|
|
|