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;
14 using System.Collections.Specialized;
16 using System.Xml.Schema;
17 using System.Xml.XPath;
19 using Mono.Xml.Xsl.Operations;
21 using QName = System.Xml.XmlQualifiedName;
23 namespace Mono.Xml.Xsl {
24 internal class XslAttributeSet : XslCompiledElement {
26 // [QName]=>XslAttributeSet
27 ArrayList usedAttributeSets = new ArrayList ();
29 // [QName]=>XslAttribute
30 ArrayList attributes = new ArrayList ();
32 public XslAttributeSet (Compiler c) : base (c) {}
38 protected override void Compile (Compiler c)
40 this.name = c.ParseQNameAttribute ("name");
42 QName [] attrSets = c.ParseQNameListAttribute ("use-attribute-sets");
44 foreach (QName q in attrSets)
45 usedAttributeSets.Add (q);
48 if (!c.Input.MoveToFirstChild ()) return;
51 switch (c.Input.NodeType) {
52 case XPathNodeType.Element:
54 case XPathNodeType.Whitespace:
57 if (c.CurrentStylesheet.Version == "1.0")
58 throw new XsltCompileException ("Content " + c.Input.NodeType + " is not allowed in XSLT attribute-set element.", null, c.Input);
62 if (c.Input.NamespaceURI != XsltNamespace || c.Input.LocalName != "attribute")
63 throw new XsltCompileException ("Invalid attr set content", null, c.Input);
64 attributes.Add (new XslAttribute (c));
65 } while (c.Input.MoveToNext ());
67 c.Input.MoveToParent ();
71 public void Merge (XslAttributeSet s)
73 attributes.AddRange (s.attributes);
75 foreach (QName q in s.usedAttributeSets)
76 if (!usedAttributeSets.Contains (q))
77 usedAttributeSets.Add (q);
80 public override void Evaluate (XslTransformProcessor p) {
83 if (usedAttributeSets != null) {
84 for (int i = 0; i < usedAttributeSets.Count; i++) {
85 QName set = (QName) usedAttributeSets [i];
86 XslAttributeSet s = p.ResolveAttributeSet (set);
88 throw new XsltException ("Could not resolve attribute set", null, p.CurrentNode);
91 throw new XsltException ("circular dependency", null, p.CurrentNode);
97 for (int i = 0; i < attributes.Count; i++)
98 ((XslAttribute) attributes [i]).Evaluate (p);