Fix regression: Default namespace not correctly used
authorNick Wellnhofer <wellnhofer@aevum.de>
Fri, 28 Sep 2012 19:04:39 +0000 (21:04 +0200)
committerDaniel Veillard <veillard@redhat.com>
Tue, 9 Oct 2012 02:51:10 +0000 (10:51 +0800)
https://bugzilla.gnome.org/show_bug.cgi?id=684564

libxslt/transform.c
tests/docs/Makefile.am
tests/docs/bug-179.xml [new file with mode: 0644]
tests/general/Makefile.am
tests/general/bug-179.out [new file with mode: 0644]
tests/general/bug-179.xsl [new file with mode: 0644]

index de2ef3c..35701de 100644 (file)
@@ -4075,7 +4075,7 @@ xsltElement(xsltTransformContextPtr ctxt, xmlNodePtr node,
         } else if (xmlStrEqual(prefix, BAD_CAST "xml")) {
             prefix = NULL;
         }
-    } else if (prefix != NULL) {
+    } else {
        xmlNsPtr ns;
        /*
        * SPEC XSLT 1.0:
@@ -4090,11 +4090,13 @@ xsltElement(xsltTransformContextPtr ctxt, xmlNodePtr node,
            * TODO: Check this in the compilation layer in case it's a
            * static value.
            */
-            xsltTransformError(ctxt, NULL, inst,
-                "xsl:element: The QName '%s:%s' has no "
-                "namespace binding in scope in the stylesheet; "
-                "this is an error, since the namespace was not "
-                "specified by the instruction itself.\n", prefix, name);
+            if (prefix != NULL) {
+                xsltTransformError(ctxt, NULL, inst,
+                    "xsl:element: The QName '%s:%s' has no "
+                    "namespace binding in scope in the stylesheet; "
+                    "this is an error, since the namespace was not "
+                    "specified by the instruction itself.\n", prefix, name);
+            }
        } else
            nsName = ns->href;
     }
index 9e2204f..12a97a8 100644 (file)
@@ -168,6 +168,7 @@ EXTRA_DIST =        \
        bug-167.xml \
        bug-168.xml \
        bug-169.xml \
+       bug-179.xml \
        character.xml \
        array.xml \
        items.xml
diff --git a/tests/docs/bug-179.xml b/tests/docs/bug-179.xml
new file mode 100644 (file)
index 0000000..69d62f2
--- /dev/null
@@ -0,0 +1 @@
+<doc/>
index 364fdd9..762eca9 100644 (file)
@@ -186,6 +186,7 @@ EXTRA_DIST = \
     bug-176.out bug-176.xsl \
     bug-177.out bug-177.xsl \
     bug-178.out bug-178.xsl \
+    bug-179.out bug-179.xsl \
     character.out character.xsl \
     character2.out character2.xsl \
     itemschoose.out itemschoose.xsl \
diff --git a/tests/general/bug-179.out b/tests/general/bug-179.out
new file mode 100644 (file)
index 0000000..0a7e67d
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<root xmlns="my::namespace">
+  <foo>...</foo>
+  <bar>...</bar>
+  <foobar>...</foobar>
+  <baz>...</baz>
+  <doc>...</doc>
+  <baz>...</baz>
+</root>
diff --git a/tests/general/bug-179.xsl b/tests/general/bug-179.xsl
new file mode 100644 (file)
index 0000000..5847e9a
--- /dev/null
@@ -0,0 +1,24 @@
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                              xmlns="my::namespace">
+
+<xsl:variable name="var">baz</xsl:variable>
+
+<xsl:output indent="yes"/>
+
+<xsl:template match="/">
+    <root> <!-- This is in the correct namespace "my::namespace" -->
+        <foo>...</foo> <!-- OK. -->
+        <xsl:element name="bar">...</xsl:element> <!-- Still okay. -->
+
+        <!-- Wrong! These are without namespace. -->
+        <xsl:element name="{concat('foo', 'bar')}">...</xsl:element>
+        <xsl:element name="{$var}">...</xsl:element>
+        <xsl:element name="{local-name(*)}">...</xsl:element>
+
+        <!-- Explicitly setting the namespace fixes this. -->
+        <xsl:element name="{$var}" namespace="my::namespace">...</xsl:element>
+    </root>
+</xsl:template>
+
+</xsl:stylesheet>
+