1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
From 70213d9c9a86adac841247b249dc188ba2aab3db Mon Sep 17 00:00:00 2001
From: Nick Wellnhofer <wellnhofer@aevum.de>
Date: Fri, 28 Sep 2012 21:04:39 +0200
Subject: [PATCH] Fix regression: Default namespace not correctly used
To: libvir-list@redhat.com
https://bugzilla.gnome.org/show_bug.cgi?id=684564
Signed-off-by: Daniel Veillard <veillard@redhat.com>
---
libxslt/transform.c | 14 ++++++++------
tests/docs/Makefile.am | 1 +
tests/docs/bug-179.xml | 1 +
tests/general/Makefile.am | 1 +
tests/general/bug-179.out | 9 +++++++++
tests/general/bug-179.xsl | 24 ++++++++++++++++++++++++
6 files changed, 44 insertions(+), 6 deletions(-)
create mode 100644 tests/docs/bug-179.xml
create mode 100644 tests/general/bug-179.out
create mode 100644 tests/general/bug-179.xsl
diff --git a/libxslt/transform.c b/libxslt/transform.c
index de2ef3c..35701de 100644
--- a/libxslt/transform.c
+++ b/libxslt/transform.c
@@ -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;
}
diff --git a/tests/docs/Makefile.am b/tests/docs/Makefile.am
index 9e2204f..12a97a8 100644
--- a/tests/docs/Makefile.am
+++ b/tests/docs/Makefile.am
@@ -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
index 0000000..69d62f2
--- /dev/null
+++ b/tests/docs/bug-179.xml
@@ -0,0 +1 @@
+<doc/>
diff --git a/tests/general/Makefile.am b/tests/general/Makefile.am
index 24d0d43..fd1e695 100644
--- a/tests/general/Makefile.am
+++ b/tests/general/Makefile.am
@@ -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
index 0000000..0a7e67d
--- /dev/null
+++ b/tests/general/bug-179.out
@@ -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
index 0000000..5847e9a
--- /dev/null
+++ b/tests/general/bug-179.xsl
@@ -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>
+
--
1.7.11.4
|