5 // Atsushi Enomoto (atsushi@ximian.com)
7 // Copyright (C) 2006 Novell, Inc. http://www.novell.com
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 // This class handles xsl:sort to have XslTransformProcessor involved in
33 // the evaluation of resulting nodeset. Beyond XPathExpression.AddSort(),
34 // it handles current() by having .
37 using System.Collections;
39 using System.Xml.XPath;
41 namespace Mono.Xml.Xsl
43 class XslSortEvaluator
45 public XslSortEvaluator (XPathExpression select, Sort [] sorterTemplates)
48 this.sorterTemplates = sorterTemplates;
49 PopulateConstantSorters ();
50 sortRunner = new XPathSorters ();
53 XPathExpression select;
54 Sort [] sorterTemplates;
55 XPathSorter [] sorters;
56 XPathSorters sortRunner;
57 bool isSorterContextDependent;
59 void PopulateConstantSorters ()
61 sorters = new XPathSorter [sorterTemplates.Length];
62 for (int i = 0; i < sorterTemplates.Length; i++) {
63 Sort sort = sorterTemplates [i];
64 if (sort.IsContextDependent)
65 isSorterContextDependent = true;
67 sorters [i] = sort.ToXPathSorter (null);
71 public BaseIterator SortedSelect (XslTransformProcessor p)
73 if (isSorterContextDependent) {
74 for (int i = 0; i < sorters.Length; i++)
75 if (sorterTemplates [i].IsContextDependent)
76 sorters [i] = sorterTemplates [i].ToXPathSorter (p);
78 BaseIterator iter = (BaseIterator) p.Select (select);
80 p.PushForEachContext ();
81 ArrayList list = new ArrayList (iter.Count);
82 while (iter.MoveNext ()) {
83 XPathSortElement item = new XPathSortElement ();
84 item.Navigator = iter.Current.Clone ();
85 item.Values = new object [sorters.Length];
86 for (int i = 0; i < sorters.Length; i++)
87 item.Values [i] = sorters [i].Evaluate (iter);
90 p.PopForEachContext ();
93 sortRunner.CopyFrom (sorters);
94 return sortRunner.Sort (list, iter.NamespaceManager);