* Form.cs: Provide meaningful message when MdiParent is assigned a
[mono.git] / mcs / class / System.XML / Mono.Xml.Xsl.Operations / XslElement.cs
index 9ac2fb0f7f517dfe7af30d57dab97e0ab7c699a8..19f2d7d9d45f7cedad236738ef62ca6c9be26400 100644 (file)
@@ -42,7 +42,7 @@ namespace Mono.Xml.Xsl.Operations {
        internal class XslElement : XslCompiledElement {
                XslAvt name, ns;
                string calcName, calcNs, calcPrefix;
-               XmlNamespaceManager nsm;
+               Hashtable nsDecls;
                bool isEmptyElement;
 
                XslOperation value;
@@ -53,29 +53,33 @@ namespace Mono.Xml.Xsl.Operations {
                {
                        name = c.ParseAvtAttribute ("name");
                        ns = c.ParseAvtAttribute ("namespace");
-                       
+                       nsDecls = c.GetNamespacesToCopy ();
                        calcName = XslAvt.AttemptPreCalc (ref name);
                        
                        if (calcName != null) {
                                int colonAt = calcName.IndexOf (':');
+                               if (colonAt == 0)
+                                       throw new XsltCompileException ("Invalid name attribute", null, c.Input);
                                calcPrefix = colonAt < 0 ? String.Empty : calcName.Substring (0, colonAt);
-                               calcName = colonAt < 0 ? calcName : calcName.Substring (colonAt + 1, calcName.Length - colonAt - 1);
-                               if (ns == null)
-                                       calcNs = c.Input.GetNamespace (calcPrefix);
+                               if (colonAt > 0)
+                                       calcName = calcName.Substring (colonAt + 1);
 
                                try {
                                        XmlConvert.VerifyNCName (calcName);
                                        if (calcPrefix != String.Empty)
                                                XmlConvert.VerifyNCName (calcPrefix);
                                } catch (XmlException ex) {
-                                       throw new XsltCompileException ("Invalid attribute name.", ex, c.Input);
+                                       throw new XsltCompileException ("Invalid name attribute", ex, c.Input);
+                               }
+
+                               if (ns == null) {
+                                       calcNs = c.Input.GetNamespace (calcPrefix);
+                                       if (calcPrefix != String.Empty && calcNs == String.Empty)
+                                               throw new XsltCompileException ("Invalid name attribute", null, c.Input);
                                }
                        } else if (ns != null)
                                calcNs = XslAvt.AttemptPreCalc (ref ns);
                        
-                       if (ns == null && calcNs == null)
-                               nsm = c.GetNsm ();
-                       
                        useAttributeSets = c.ParseQNameListAttribute ("use-attribute-sets");
                        
                        isEmptyElement = c.Input.IsEmptyElement;
@@ -93,36 +97,26 @@ namespace Mono.Xml.Xsl.Operations {
                        localName = nm = calcName != null ? calcName : name.Evaluate (p);
                        nmsp = calcNs != null ? calcNs : ns != null ? ns.Evaluate (p) : null;
 
-                       if (nmsp == null) {
-                               QName q = XslNameUtil.FromString (nm, nsm);
-                               localName = q.Name;
+                       QName q = XslNameUtil.FromString (nm, nsDecls);
+                       localName = q.Name;
+                       if (nmsp == null)
                                nmsp = q.Namespace;
-                               int colonAt = nm.IndexOf (':');
-                               if (colonAt > 0)
-                                       calcPrefix = nm.Substring (0, colonAt);
-                       }
-                       prefix = calcPrefix != null ? calcPrefix : String.Empty;
+                       int colonAt = nm.IndexOf (':');
+                       if (colonAt > 0)
+                               calcPrefix = nm.Substring (0, colonAt);
+                       else if (colonAt == 0)
+                               // raises an error
+                               XmlConvert.VerifyNCName (String.Empty);
 
-#if false
-                       if (calcPrefix == String.Empty) {
-                               if (nav.MoveToFirstNamespace (XPathNamespaceScope.ExcludeXml)) {
-                                       do {
-                                               if (nav.Value == nmsp) {
-//                                                     prefix = nav.Name;
-                                                       break;
-                                               }
-                                       } while (nav.MoveToNextNamespace (XPathNamespaceScope.ExcludeXml));
-                                       nav.MoveToParent ();
-                               }
-                       }
-#endif
+                       prefix = calcPrefix != null ? calcPrefix : String.Empty;
 
-                       XmlConvert.VerifyName (nm);
+                       if (prefix != String.Empty)
+                               XmlConvert.VerifyNCName (prefix);
+                       XmlConvert.VerifyNCName (localName);
 
                        bool isCData = p.InsideCDataElement;
                        p.PushElementState (prefix, localName, nmsp, false);
                        p.Out.WriteStartElement (prefix, localName, nmsp);
-//                     p.TryElementNamespacesOutput (null, null, null);
 
                        if (useAttributeSets != null)
                                foreach (XmlQualifiedName s in useAttributeSets)