diff options
Diffstat (limited to 'mcs/class/System.XML/Mono.Xml.Xsl.Operations')
3 files changed, 36 insertions, 9 deletions
diff --git a/mcs/class/System.XML/Mono.Xml.Xsl.Operations/ChangeLog b/mcs/class/System.XML/Mono.Xml.Xsl.Operations/ChangeLog index cbf770da9db..6604b4537c9 100644 --- a/mcs/class/System.XML/Mono.Xml.Xsl.Operations/ChangeLog +++ b/mcs/class/System.XML/Mono.Xml.Xsl.Operations/ChangeLog @@ -1,3 +1,9 @@ +2005-03-15 Atsushi Enomoto <atsushi@ximian.com> + + * XslApplyTemplates.cs, XslSort.cs : use new XslSortEvaluator.cs + instead of XPathExpression.AddSort() to handle XSLT current node + context correctly. + 2005-12-23 Gert Driesen <drieseng@users.sourceforge.net> * XslVariable.cs: Beautify error messages. diff --git a/mcs/class/System.XML/Mono.Xml.Xsl.Operations/XslApplyTemplates.cs b/mcs/class/System.XML/Mono.Xml.Xsl.Operations/XslApplyTemplates.cs index c36e41910fe..8e4bae85425 100644 --- a/mcs/class/System.XML/Mono.Xml.Xsl.Operations/XslApplyTemplates.cs +++ b/mcs/class/System.XML/Mono.Xml.Xsl.Operations/XslApplyTemplates.cs @@ -42,14 +42,15 @@ namespace Mono.Xml.Xsl.Operations { XPathExpression select; XmlQualifiedName mode; ArrayList withParams; - + XslSortEvaluator sortEvaluator; + public XslApplyTemplates (Compiler c) : base (c) {} protected override void Compile (Compiler c) { select = c.CompileExpression (c.GetAttribute ("select")); mode = c.ParseQNameAttribute ("mode"); - + ArrayList sorterList = null; if (c.Input.MoveToFirstChild ()) { do { switch (c.Input.NodeType) { @@ -71,9 +72,12 @@ namespace Mono.Xml.Xsl.Operations { break; case "sort": + if (sorterList == null) + sorterList = new ArrayList (); if (select == null) select = c.CompileExpression ("*"); - c.AddSort (select, new Sort (c)); + sorterList.Add (new Sort (c)); + //c.AddSort (select, new Sort (c)); break; default: throw new XsltCompileException ("Unexpected element", null, c.Input); // todo forwards compat @@ -85,14 +89,21 @@ namespace Mono.Xml.Xsl.Operations { } while (c.Input.MoveToNext ()); c.Input.MoveToParent (); } + if (sorterList != null) + sortEvaluator = new XslSortEvaluator (select, + (Sort []) sorterList.ToArray (typeof (Sort))); } public override void Evaluate (XslTransformProcessor p) { if (select == null) p.ApplyTemplates (p.CurrentNode.SelectChildren (XPathNodeType.All), mode, withParams); - else - p.ApplyTemplates (p.Select (select), mode, withParams); + else { + XPathNodeIterator iter = sortEvaluator != null ? + sortEvaluator.SortedSelect (p) : + p.Select (select); + p.ApplyTemplates (iter, mode, withParams); + } } } } diff --git a/mcs/class/System.XML/Mono.Xml.Xsl.Operations/XslForEach.cs b/mcs/class/System.XML/Mono.Xml.Xsl.Operations/XslForEach.cs index 6530da87e5b..e06dafc5663 100644 --- a/mcs/class/System.XML/Mono.Xml.Xsl.Operations/XslForEach.cs +++ b/mcs/class/System.XML/Mono.Xml.Xsl.Operations/XslForEach.cs @@ -40,6 +40,7 @@ namespace Mono.Xml.Xsl.Operations { internal class XslForEach : XslCompiledElement { XPathExpression select; XslOperation children; + XslSortEvaluator sortEvaluator; public XslForEach (Compiler c) : base (c) {} @@ -47,6 +48,7 @@ namespace Mono.Xml.Xsl.Operations { { c.AssertAttribute ("select"); select = c.CompileExpression (c.GetAttribute ("select")); + ArrayList sorterList = null; if (c.Input.MoveToFirstChild ()) { bool alldone = true; @@ -60,14 +62,18 @@ namespace Mono.Xml.Xsl.Operations { { alldone = false; break; } if (c.Input.LocalName != "sort") { alldone = false; break; } - - c.AddSort (select, new Sort (c)); - + //c.AddSort (select, new Sort (c)); + if (sorterList == null) + sorterList = new ArrayList (); + sorterList.Add (new Sort (c)); } while (c.Input.MoveToNext ()); if (!alldone) children = c.CompileTemplateContent (); c.Input.MoveToParent (); } + if (sorterList != null) + sortEvaluator = new XslSortEvaluator (select, + (Sort []) sorterList.ToArray (typeof (Sort))); } public override void Evaluate (XslTransformProcessor p) @@ -75,7 +81,11 @@ namespace Mono.Xml.Xsl.Operations { if (children == null) return; - p.PushNodeset (p.Select (select)); + XPathNodeIterator iter = sortEvaluator != null ? + sortEvaluator.SortedSelect (p) : + p.Select (select); + + p.PushNodeset (iter); p.PushForEachContext (); while (p.NodesetMoveNext ()) |