2003-08-01 Ben Maurer <bmaurer@users.sourceforge.net>
authorBen Maurer <benm@mono-cvs.ximian.com>
Fri, 1 Aug 2003 19:29:15 +0000 (19:29 -0000)
committerBen Maurer <benm@mono-cvs.ximian.com>
Fri, 1 Aug 2003 19:29:15 +0000 (19:29 -0000)
* Compiler.cs, XslAttributeSet.cs: Handle attribute set merging

svn path=/trunk/mcs/; revision=16994

mcs/class/System.XML/Mono.Xml.Xsl/ChangeLog
mcs/class/System.XML/Mono.Xml.Xsl/Compiler.cs
mcs/class/System.XML/Mono.Xml.Xsl/XslAttributeSet.cs

index bbe1f1e383886809a89e4dc8e7254406e0ef1bbd..2c9daf209166c4beb5beb142840c3fa75d4f1a96 100644 (file)
@@ -1,3 +1,7 @@
+2003-08-01 Ben Maurer  <bmaurer@users.sourceforge.net>
+
+       * Compiler.cs, XslAttributeSet.cs: Handle attribute set merging
+
 2003-08-01 Ben Maurer  <bmaurer@users.sourceforge.net>
 
        * XslTransformProcessor.cs: Add EvaluateNumber method.
index 8dc566c784da24a22282d247a2be5cd7cf33035c..30634456a072239af596640ff4978ddbb1e1ddc7 100644 (file)
@@ -238,6 +238,11 @@ namespace Mono.Xml.Xsl {
                
                public void AddAttributeSet (XslAttributeSet set)
                {
+                       XslAttributeSet existing = attrSets [set.Name] as XslAttributeSet;
+                       // The latter set will have higher priority
+                       if (existing != null)
+                               set.Merge (existing);
+                       
                        attrSets [set.Name] = set; 
                }
                
index 3b1007ee30d1bf7bc3358a193d2df9e9b9d9cdc0..76b8d82ab83f81f6f6d27709b86440442e826f0c 100644 (file)
@@ -25,7 +25,7 @@ namespace Mono.Xml.Xsl {
        public class XslAttributeSet : XslCompiledElement {
                QName name;
                // [QName]=>XslAttributeSet
-               QName [] usedAttributeSets;
+               ArrayList usedAttributeSets = new ArrayList ();
                
                // [QName]=>XslAttribute
                ArrayList attributes = new ArrayList ();
@@ -40,7 +40,8 @@ namespace Mono.Xml.Xsl {
                {
                        this.name = c.ParseQNameAttribute ("name");
                        
-                       usedAttributeSets = c.ParseQNameListAttribute ("use-attribute-sets");
+                       foreach (QName q in c.ParseQNameListAttribute ("use-attribute-sets"))
+                               usedAttributeSets.Add (q);
 
                        
                        if (!c.Input.MoveToFirstChild ()) return;
@@ -57,7 +58,17 @@ namespace Mono.Xml.Xsl {
                        
                }
                
+               public void Merge (XslAttributeSet s)
+               {
+                       attributes.AddRange (s.attributes);
+                       
+                       foreach (QName q in s.usedAttributeSets)
+                               if (!usedAttributeSets.Contains (q))
+                                       usedAttributeSets.Add (q);
+               }
+               
                // busy flag to detect circular dependencies
+               // TODO: Move this logic into the compiler, for MT safty
                bool busy = false;
                public override void Evaluate (XslTransformProcessor p) {
                        busy = true;