* Form.cs: Provide meaningful message when MdiParent is assigned a
[mono.git] / mcs / class / System.XML / Mono.Xml.Xsl.Operations / XslLiteralElement.cs
index 9ec2c144c0d99b7f96434e975f55064821457b89..967489f04672a817b6db6e589620ec5e8296ed38 100644 (file)
@@ -9,6 +9,27 @@
 // (C) 2003 Atsushi Enomoto
 //
 
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
 using System;
 using System.Collections;
 using System.Xml;
@@ -16,19 +37,13 @@ using System.Xml.XPath;
 using System.Xml.Xsl;
 
 namespace Mono.Xml.Xsl.Operations {    
-       public class XslLiteralElement : XslCompiledElement {
+       internal class XslLiteralElement : XslCompiledElement {
                XslOperation children;
                string localname, prefix, nsUri;
                bool isEmptyElement;
                ArrayList attrs;
                XmlQualifiedName [] useAttributeSets;
                Hashtable nsDecls;
-               string excludeResultPrefixes;
-               string extensionElementPrefixes;
-               ArrayList excludedPrefixes;
-               bool requireNameFix;
-               XPathNavigator stylesheetNode;
-               XslStylesheet stylesheet;
 
                public XslLiteralElement (Compiler c) : base (c) {}
                        
@@ -39,32 +54,47 @@ namespace Mono.Xml.Xsl.Operations {
                        public XslLiteralAttribute (Compiler c)
                        {
                                this.prefix = c.Input.Prefix;
-                               this.nsUri = c.Input.NamespaceURI;
+                               if (prefix.Length > 0) {
+                                       string alias = 
+                                               c.CurrentStylesheet.GetActualPrefix (prefix);
+                                       if (alias != prefix) {
+                                               prefix = alias;
+                                               XPathNavigator clone = c.Input.Clone ();
+                                               clone.MoveToParent ();
+                                               nsUri = clone.GetNamespace (alias);
+                                       }
+                                       else
+                                               nsUri = c.Input.NamespaceURI;
+                               }
+                               else
+                                       nsUri = String.Empty;
                                this.localname = c.Input.LocalName;
                                this.val = new XslAvt (c.Input.Value, c);
                        }
                        
                        public void Evaluate (XslTransformProcessor p)
                        {
+                               //FIXME: fix attribute prefixes according to aliases
                                p.Out.WriteAttributeString (prefix, localname, nsUri, val.Evaluate (p));
                        }
                }
                
                protected override void Compile (Compiler c)
                {
-                       requireNameFix = true;
-                       stylesheetNode = c.Input.Clone ();
-                       stylesheet = c.CurrentStylesheet;
+                       prefix = c.Input.Prefix;
+                       string alias = c.CurrentStylesheet.GetActualPrefix (prefix);
+                       if (alias != prefix) {
+                               prefix = alias;
+                               nsUri = c.Input.GetNamespace (alias);
+                       }
+                       else
+                               nsUri = c.Input.NamespaceURI;
 
                        this.localname = c.Input.LocalName;
                        this.useAttributeSets = c.ParseQNameListAttribute ("use-attribute-sets", XsltNamespace);
                        this.nsDecls = c.GetNamespacesToCopy ();
                        if (nsDecls.Count == 0) nsDecls = null;
                        this.isEmptyElement = c.Input.IsEmptyElement;
-                       this.excludeResultPrefixes = c.Input.GetAttribute ("exclude-result-prefixes", XsltNamespace);
-                       this.extensionElementPrefixes = c.Input.GetAttribute ("extension-element-prefixes", XsltNamespace);
-                       excludedPrefixes = new ArrayList (excludeResultPrefixes.Split (XmlChar.WhitespaceChars));
-                       excludedPrefixes.AddRange (extensionElementPrefixes.Split (XmlChar.WhitespaceChars));
 
                        if (c.Input.MoveToFirstAttribute ())
                        {
@@ -82,30 +112,12 @@ namespace Mono.Xml.Xsl.Operations {
                        c.Input.MoveToParent ();
                }
 
-               private void GetCorrectNames ()
-               {
-                       requireNameFix = false;
-                       prefix = stylesheetNode.Prefix;
-                       string alias = stylesheet.PrefixInEffect (prefix, null);
-                       if (alias != null && alias != stylesheetNode.Prefix) {
-                               nsUri = stylesheetNode.GetNamespace (alias);
-                               if (alias != null)
-                                       prefix = alias;
-                       }
-                       else
-                               nsUri = stylesheetNode.NamespaceURI;
-
-               }
-               
                public override void Evaluate (XslTransformProcessor p)
                {
                        // Since namespace-alias might be determined after compilation
                        // of import-ing stylesheets, this must be determined later.
-                       if (requireNameFix)
-                               GetCorrectNames ();
-
                        bool isCData = p.InsideCDataElement;
-                       p.PushElementState (localname, nsUri, true);
+                       p.PushElementState (prefix, localname, nsUri, true);
                        p.Out.WriteStartElement (prefix, localname, nsUri);
 
                        if (useAttributeSets != null)
@@ -118,15 +130,8 @@ namespace Mono.Xml.Xsl.Operations {
                                        ((XslLiteralAttribute)attrs [i]).Evaluate (p);
                        }
 
-                       p.TryStylesheetNamespaceOutput (excludedPrefixes);
-                       if (nsDecls != null) {
-                               foreach (DictionaryEntry de in nsDecls) {
-                                       string actualPrefix = p.CompiledStyle.Style.PrefixInEffect (de.Key as String, excludedPrefixes);
-                                       if (actualPrefix != null)
-                                               p.Out.WriteNamespaceDecl (actualPrefix, (string)de.Value);
-                               }
-                       }
-                       
+                       p.OutputLiteralNamespaceUriNodes (nsDecls, null, null);
+
                        if (children != null) children.Evaluate (p);
 
                        if (isEmptyElement)