diff options
author | Atsushi Eno <atsushieno@gmail.com> | 2006-03-15 17:43:45 +0300 |
---|---|---|
committer | Atsushi Eno <atsushieno@gmail.com> | 2006-03-15 17:43:45 +0300 |
commit | a40a00bcde3ffd7a8a449596a2653d190f6e8b94 (patch) | |
tree | f35d0fe706dfa497c5c0e6c3d91fde08b08a5dc9 /mcs/class/System.XML/Mono.Xml.Xsl.Operations | |
parent | e8e59bb8cbdf347b704e34bfc9f342b3dc41f731 (diff) |
2006-03-15 Atsushi Enomoto <atsushi@ximian.com>
* XslTransformProcessor.cs,
Compiler.cs : eliminate ExpressionStore. Now sorting is done
inside XslSortEvaluator.
* XslSortEvaluator.cs : new file. It handles current node in XSLT
context. Fixed bug #77781.
* Expression.cs : extracted XPathSortElement, XPathSorters
and XPathSorter from CompiledExpression, and split
XPathSorters.Sort() into some methods. Those changes are to make
them reusable in XslSortEvaluator.
* System.Xml.dll.sources : added XslSortEvaluator.cs.
* knownFailures.txt : removed two xsl:sort+current() tests.
svn path=/trunk/mcs/; revision=58015
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 ()) |