Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAtsushi Eno <atsushieno@gmail.com>2006-03-15 17:43:45 +0300
committerAtsushi Eno <atsushieno@gmail.com>2006-03-15 17:43:45 +0300
commita40a00bcde3ffd7a8a449596a2653d190f6e8b94 (patch)
treef35d0fe706dfa497c5c0e6c3d91fde08b08a5dc9 /mcs/class/System.XML/Mono.Xml.Xsl.Operations
parente8e59bb8cbdf347b704e34bfc9f342b3dc41f731 (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')
-rw-r--r--mcs/class/System.XML/Mono.Xml.Xsl.Operations/ChangeLog6
-rw-r--r--mcs/class/System.XML/Mono.Xml.Xsl.Operations/XslApplyTemplates.cs21
-rw-r--r--mcs/class/System.XML/Mono.Xml.Xsl.Operations/XslForEach.cs18
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 ())