fixed obscure namespace problem related to exclude-result-prefix
authorWilliam M. Brack <wbrack@src.gnome.org>
Thu, 31 May 2007 19:40:11 +0000 (19:40 +0000)
committerWilliam M. Brack <wbrack@src.gnome.org>
Thu, 31 May 2007 19:40:11 +0000 (19:40 +0000)
* libxslt/xslt.c: fixed obscure namespace problem related to
  exclude-result-prefix

svn path=/trunk/; revision=1429

ChangeLog
libxslt/xslt.c

index b5fe078..1facc3c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Thu May 31 12:38:08 PDT 2007 WIlliam Brack <wbrack@mmm.com.hk>
+
+       * libxslt/xslt.c: fixed obscure namespace problem related to
+         exclude-result-prefix
+
 Mon May  7 00:14:28 HKT 2007 William Brack <wbrack@mmm.com.hk>
 
        * libxslt/transform.c: fixed minor compilation warning; no change
index bead6db..b0b3160 100644 (file)
@@ -3469,7 +3469,7 @@ xsltPrecomputeStylesheet(xsltStylesheetPtr style, xmlNodePtr cur)
            }
                     
            if ((cur->nsDef != NULL) && (style->exclPrefixNr > 0)) {
-               xmlNsPtr ns = cur->nsDef, prev = NULL, next;
+               xmlNsPtr ns = cur->nsDef, prev = NULL, next, rns;
                xmlNodePtr root = NULL;
                int i, moved;
 
@@ -3482,18 +3482,27 @@ xsltPrecomputeStylesheet(xsltStylesheetPtr style, xmlNodePtr cur)
                            if ((ns->prefix != NULL) && 
                                (xmlStrEqual(ns->href,
                                             style->exclPrefixTab[i]))) {
-                               /*
-                                * Move the namespace definition on the root
-                                * element to avoid duplicating it without
-                                * loosing it.
-                                */
+                               /* Remove the namespace from this node */
                                if (prev == NULL) {
                                    cur->nsDef = ns->next;
                                } else {
                                    prev->next = ns->next;
                                }
-                               ns->next = root->nsDef;
-                               root->nsDef = ns;
+                               /*
+                                * If this prefix is not already present,
+                                * move the namespace definition on the root
+                                * element to avoid duplicating it without
+                                * loosing it.
+                                */
+                               for (rns = root->nsDef; rns != NULL; rns = rns->next)
+                                   if (xmlStrEqual(ns->prefix, rns->prefix))
+                                       break;
+                               if (rns == NULL) {
+                                   ns->next = root->nsDef;
+                                   root->nsDef = ns;
+                               }
+                               else
+                                   xmlFreeNs(ns);
                                moved = 1;
                                break;
                            }