5 // Ben Maurer (bmaurer@users.sourceforge.net)
6 // Atsushi Enomoto (ginga@kit.hi-ho.ne.jp)
9 // (C) 2003 Atsushi Enomoto
13 using System.Collections;
15 using System.Xml.XPath;
19 using QName = System.Xml.XmlQualifiedName;
21 namespace Mono.Xml.Xsl.Operations {
22 public class XslAttribute : XslCompiledElement {
24 string calcName, calcNs, calcPrefix;
25 XmlNamespaceManager nsm;
30 public XslAttribute (Compiler c) : base (c) {}
32 protected override void Compile (Compiler c)
34 nav = c.Input.Clone ();
36 name = c.ParseAvtAttribute ("name");
37 ns = c.ParseAvtAttribute ("namespace");
39 calcName = XslAvt.AttemptPreCalc (ref name);
41 if (calcName != null && ns == null) {
42 int colonAt = calcName.IndexOf (':');
43 calcPrefix = colonAt < 0 ? String.Empty : calcName.Substring (0, colonAt);
44 calcName = colonAt < 0 ? calcName : calcName.Substring (colonAt + 1, calcName.Length - colonAt - 1);
45 calcNs = nav.GetNamespace (calcPrefix);
46 } else if (ns != null)
47 calcNs = XslAvt.AttemptPreCalc (ref ns);
49 if (ns == null && calcNs == null)
52 if (c.Input.MoveToFirstChild ()) {
53 value = c.CompileTemplateContent ();
54 c.Input.MoveToParent ();
59 public override void Evaluate (XslTransformProcessor p)
61 string nm, nmsp, localName, prefix;
63 nm = calcName != null ? calcName : name.Evaluate (p);
64 nmsp = calcNs != null ? calcNs : ns != null ? ns.Evaluate (p) : String.Empty;
65 prefix = calcPrefix != null ? calcPrefix : String.Empty;
68 // It is an error. We must recover by not emmiting any attributes
69 // (unless we throw an exception).
72 int colonAt = nm.IndexOf (':');
74 prefix = colonAt < 0 ? String.Empty : nm.Substring (0, colonAt);
75 nm = colonAt < 0 ? nm : nm.Substring (colonAt + 1, nm.Length - colonAt - 1);
79 QName q = XslNameUtil.FromString (nm, nsm);
83 nm = XslNameUtil.LocalNameOf (nm);
86 if (nmsp != String.Empty && prefix == String.Empty) {
87 if (nav.MoveToFirstNamespace (XPathNamespaceScope.ExcludeXml)) {
89 if (nav.Value == nmsp) {
93 } while (nav.MoveToNextNamespace (XPathNamespaceScope.ExcludeXml));
98 if (prefix == "xmlns")
99 prefix = String.Empty; // Should not be allowed.
101 XmlConvert.VerifyName (nm);
104 p.Out.WriteAttributeString(prefix, nm, nmsp, "");
106 StringWriter sw = new StringWriter ();
107 Outputter outputter = new TextOutputter (sw, true);
108 p.PushOutput (outputter);
112 p.Out.WriteAttributeString (prefix, nm, nmsp, sw.ToString ());