Author: atsushi
Date: 2005-03-22 02:39:29 -0500 (Tue, 22 Mar 2005)
New Revision: 42066
Modified:
trunk/mcs/class/System.XML/Mono.Xml.XPath/ChangeLog
trunk/mcs/class/System.XML/Mono.Xml.XPath/KeyPattern.cs
trunk/mcs/class/System.XML/Mono.Xml.XPath/Pattern.cs
trunk/mcs/class/System.XML/Mono.Xml.Xsl/ChangeLog
trunk/mcs/class/System.XML/Mono.Xml.Xsl/Compiler.cs
trunk/mcs/class/System.XML/Mono.Xml.Xsl/XslFunctions.cs
trunk/mcs/class/System.XML/Mono.Xml.Xsl/XslKey.cs
trunk/mcs/class/System.XML/Mono.Xml.Xsl/XsltCompiledContext.cs
Log:
2004-03-22 Atsushi Enomoto <[EMAIL PROTECTED]>
* Compiler.cs : Now it holds XPath parser and XSLT pattern parser.
* XslKey.cs : Use XSLT pattern parser for match.
UsePattern is now "Use" (it is not a pattern).
Reimplemented Evaluate() to make full use of index table.
Added Matches() to handle shorter match evaluation. For const value
for key (e.g. key patterns), it could avoid Evaluate().
* XsltCompiledContext.cs : Added MatchesKey() that just delegates to
new KeyIndexTable.Matches().
* XslFunctions.cs : Added PatternMatches() that just delegates to new
XsltCompiledContext.MatchesKey().
* Pattern.cs : Pattern.Compile() now uses XSLT pattern parser instead
of XPath parser.
* KeyPattern.cs : Matches() now just delegates to XsltKey.MatchesKey().
Modified: trunk/mcs/class/System.XML/Mono.Xml.XPath/ChangeLog
===================================================================
--- trunk/mcs/class/System.XML/Mono.Xml.XPath/ChangeLog 2005-03-22 07:31:48 UTC
(rev 42065)
+++ trunk/mcs/class/System.XML/Mono.Xml.XPath/ChangeLog 2005-03-22 07:39:29 UTC
(rev 42066)
@@ -1,5 +1,11 @@
2004-03-22 Atsushi Enomoto <[EMAIL PROTECTED]>
+ * Pattern.cs : Pattern.Compile() now uses XSLT pattern parser instead
+ of XPath parser.
+ * KeyPattern.cs : Matches() now just delegates to XsltKey.MatchesKey().
+
+2004-03-22 Atsushi Enomoto <[EMAIL PROTECTED]>
+
* DTMXPathDocumentBuilder.cs,
DTMXPathDocumentWriter.cs,
DTMXPathNavigator.cs,
Modified: trunk/mcs/class/System.XML/Mono.Xml.XPath/KeyPattern.cs
===================================================================
--- trunk/mcs/class/System.XML/Mono.Xml.XPath/KeyPattern.cs 2005-03-22
07:31:48 UTC (rev 42065)
+++ trunk/mcs/class/System.XML/Mono.Xml.XPath/KeyPattern.cs 2005-03-22
07:39:29 UTC (rev 42066)
@@ -51,11 +51,7 @@
public override bool Matches (XPathNavigator node, XsltContext
ctx)
{
- XPathNodeIterator iter = key.EvaluateNodeSet (new
SelfIterator (node, ctx));
- while (iter.MoveNext ())
- if (iter.Current.IsSamePosition (node))
- return true;
- return false;
+ return key.PatternMatches (node, ctx);
}
public override double DefaultPriority { get { return 0.5; } }
Modified: trunk/mcs/class/System.XML/Mono.Xml.XPath/Pattern.cs
===================================================================
--- trunk/mcs/class/System.XML/Mono.Xml.XPath/Pattern.cs 2005-03-22
07:31:48 UTC (rev 42065)
+++ trunk/mcs/class/System.XML/Mono.Xml.XPath/Pattern.cs 2005-03-22
07:39:29 UTC (rev 42066)
@@ -43,7 +43,7 @@
{
internal static Pattern Compile (string s, Compiler comp)
{
- return Compile (comp.parser.Compile (s));
+ return Compile (comp.patternParser.Compile (s));
}
internal static Pattern Compile (Expression e)
Modified: trunk/mcs/class/System.XML/Mono.Xml.Xsl/ChangeLog
===================================================================
--- trunk/mcs/class/System.XML/Mono.Xml.Xsl/ChangeLog 2005-03-22 07:31:48 UTC
(rev 42065)
+++ trunk/mcs/class/System.XML/Mono.Xml.Xsl/ChangeLog 2005-03-22 07:39:29 UTC
(rev 42066)
@@ -1,5 +1,18 @@
2005-03-22 Atsushi Enomoto <[EMAIL PROTECTED]>
+ * Compiler.cs : Now it holds XPath parser and XSLT pattern parser.
+ * XslKey.cs : Use XSLT pattern parser for match.
+ UsePattern is now "Use" (it is not a pattern).
+ Reimplemented Evaluate() to make full use of index table.
+ Added Matches() to handle shorter match evaluation. For const value
+ for key (e.g. key patterns), it could avoid Evaluate().
+ * XsltCompiledContext.cs : Added MatchesKey() that just delegates to
+ new KeyIndexTable.Matches().
+ * XslFunctions.cs : Added PatternMatches() that just delegates to new
+ XsltCompiledContext.MatchesKey().
+
+2005-03-22 Atsushi Enomoto <[EMAIL PROTECTED]>
+
* GenericOutputter.cs : commented out warned fields.
2005-03-15 Atsushi Enomoto <[EMAIL PROTECTED]>
Modified: trunk/mcs/class/System.XML/Mono.Xml.Xsl/Compiler.cs
===================================================================
--- trunk/mcs/class/System.XML/Mono.Xml.Xsl/Compiler.cs 2005-03-22 07:31:48 UTC
(rev 42065)
+++ trunk/mcs/class/System.XML/Mono.Xml.Xsl/Compiler.cs 2005-03-22 07:39:29 UTC
(rev 42066)
@@ -127,7 +127,8 @@
public CompiledStylesheet Compile (XPathNavigator nav,
XmlResolver res, Evidence evidence)
{
- this.parser = new XPathParser (this);
+ this.xpathParser = new XPathParser (this);
+ this.patternParser = new XsltPatternParser (this);
this.res = res;
if (res == null)
this.res = new XmlUrlResolver ();
@@ -350,7 +351,8 @@
return p;
}
- internal XPathParser parser;
+ internal XPathParser xpathParser;
+ internal XsltPatternParser patternParser;
internal CompiledExpression CompileExpression (string
expression)
{
return CompileExpression (expression, false);
@@ -360,7 +362,7 @@
{
if (expression == null || expression == "") return null;
- Expression expr = parser.Compile (expression);
+ Expression expr = xpathParser.Compile (expression);
if (isKey)
expr = new ExprKeyContainer (expr);
CompiledExpression e = new CompiledExpression
(expression, expr);
Modified: trunk/mcs/class/System.XML/Mono.Xml.Xsl/XslFunctions.cs
===================================================================
--- trunk/mcs/class/System.XML/Mono.Xml.Xsl/XslFunctions.cs 2005-03-22
07:31:48 UTC (rev 42065)
+++ trunk/mcs/class/System.XML/Mono.Xml.Xsl/XslFunctions.cs 2005-03-22
07:39:29 UTC (rev 42066)
@@ -546,7 +546,16 @@
internal override bool Peer {
get { return arg0.Peer && arg1.Peer; }
}
-
+
+ public bool PatternMatches (XPathNavigator nav, XsltContext
nsmgr)
+ {
+ XsltCompiledContext ctx = nsmgr as XsltCompiledContext;
+ // for key pattern, it must contain literal value
+ return ctx.MatchesKey (nav, staticContext,
+ arg0.StaticValueAsString,
+ arg1.StaticValueAsString);
+ }
+
public override object Evaluate (BaseIterator iter)
{
XsltCompiledContext ctx = iter.NamespaceManager
Modified: trunk/mcs/class/System.XML/Mono.Xml.Xsl/XslKey.cs
===================================================================
--- trunk/mcs/class/System.XML/Mono.Xml.Xsl/XslKey.cs 2005-03-22 07:31:48 UTC
(rev 42065)
+++ trunk/mcs/class/System.XML/Mono.Xml.Xsl/XslKey.cs 2005-03-22 07:39:29 UTC
(rev 42066)
@@ -37,6 +37,7 @@
using System.Xml.Schema;
using System.Xml.XPath;
using System.Xml.Xsl;
+using Mono.Xml.XPath;
using QName = System.Xml.XmlQualifiedName;
@@ -75,8 +76,8 @@
internal class XslKey
{
QName name;
- CompiledExpression usePattern;
- CompiledExpression matchPattern;
+ CompiledExpression useExpr;
+ Pattern matchPattern;
// Hashtable map;
// Hashtable mappedDocuments;
@@ -85,19 +86,19 @@
this.name = c.ParseQNameAttribute ("name");
c.KeyCompilationMode = true;
- usePattern = c.CompileExpression (c.GetAttribute
("use"));
- if (usePattern == null)
- usePattern = c.CompileExpression (".");
+ useExpr = c.CompileExpression (c.GetAttribute ("use"));
+ if (useExpr == null)
+ useExpr = c.CompileExpression (".");
c.AssertAttribute ("match");
string matchString = c.GetAttribute ("match");
- this.matchPattern = c.CompileExpression (matchString,
true);
+ this.matchPattern = c.CompilePattern (matchString,
c.Input);
c.KeyCompilationMode = false;
}
public QName Name { get { return name; }}
- internal CompiledExpression UsePattern { get { return
usePattern; }}
- internal CompiledExpression MatchPattern { get { return
matchPattern; }}
+ internal CompiledExpression Use { get { return useExpr; }}
+ internal Pattern Match { get { return matchPattern; }}
}
// represents part of dynamic context that holds index table for a key
@@ -118,18 +119,21 @@
get { return key; }
}
- private void CollectTable (XPathNavigator doc)
+ private void CollectTable (XPathNavigator doc, XsltContext ctx)
{
XPathNavigator nav = doc.Clone ();
nav.MoveToRoot ();
XPathNavigator tmp = doc.Clone ();
do {
- if (nav.Matches (key.MatchPattern)) {
+ if (key.Match.Matches (nav, ctx)) {
tmp.MoveTo (nav);
CollectIndex (nav, tmp);
}
} while (MoveNavigatorToNext (nav));
+ if (map != null)
+ foreach (ArrayList list in map.Values)
+ list.Sort
(XPathNavigatorComparer.Instance);
}
private bool MoveNavigatorToNext (XPathNavigator nav)
@@ -146,24 +150,24 @@
private void CollectIndex (XPathNavigator nav, XPathNavigator
target)
{
XPathNodeIterator iter;
- switch (key.UsePattern.ReturnType) {
+ switch (key.Use.ReturnType) {
case XPathResultType.NodeSet:
- iter = nav.Select (key.UsePattern);
+ iter = nav.Select (key.Use);
while (iter.MoveNext ())
AddIndex (iter.Current.Value, target);
break;
case XPathResultType.Any:
- object o = nav.Evaluate (key.UsePattern);
+ object o = nav.Evaluate (key.Use);
iter = o as XPathNodeIterator;
if (iter != null) {
while (iter.MoveNext ())
AddIndex (iter.Current.Value,
target);
}
else
- AddIndex (nav.EvaluateString
(key.UsePattern, null, null), target);
+ AddIndex (XPathFunctions.ToString (o),
target);
break;
default:
- string keyValue = nav.EvaluateString
(key.UsePattern, null, null);
+ string keyValue = nav.EvaluateString (key.Use,
null, null);
AddIndex (keyValue, target);
break;
}
@@ -182,7 +186,7 @@
al.Add (target.Clone ());
}
- public bool Matches (XPathNavigator nav, string value)
+ private ArrayList GetNodesByValue (XPathNavigator nav, string
value, XsltContext ctx)
{
if (map == null) {
mappedDocuments = new Hashtable ();
@@ -190,14 +194,15 @@
}
if (!mappedDocuments.ContainsKey (nav.BaseURI)) {
mappedDocuments.Add (nav.BaseURI, nav.BaseURI);
- key.MatchPattern.SetContext (ctx);
- key.UsePattern.SetContext (ctx);
- CollectTable (nav);
- key.MatchPattern.SetContext (null);
- key.UsePattern.SetContext (null);
+ CollectTable (nav, ctx);
}
- ArrayList al = map [value] as ArrayList;
+ return map [value] as ArrayList;
+ }
+
+ public bool Matches (XPathNavigator nav, string value,
XsltContext ctx)
+ {
+ ArrayList al = GetNodesByValue (nav, value, ctx);
if (al == null)
return false;
for (int i = 0; i < al.Count; i++)
@@ -207,38 +212,79 @@
}
// Invoked from XsltKey (XPathFunction)
- public object Evaluate (BaseIterator iter,
+ public BaseIterator Evaluate (BaseIterator iter,
Expression valueExpr)
{
+ /*
ArrayList result = new ArrayList ();
object o = valueExpr.Evaluate (iter);
XPathNodeIterator it = o as XPathNodeIterator;
-
+ XsltContext ctx = iter.NamespaceManager as XsltContext;
+
if (it != null) {
while (it.MoveNext())
- FindKeyMatch (it.Current.Value, result,
iter.Current);
+ FindKeyMatch (it.Current.Value, result,
iter.Current, ctx);
} else {
- FindKeyMatch (XPathFunctions.ToString (o),
result, iter.Current);
+ FindKeyMatch (XPathFunctions.ToString (o),
result, iter.Current, ctx);
}
result.Sort (XPathNavigatorComparer.Instance);
return new ListIterator (result, (ctx));
+ */
+
+ XPathNodeIterator i = iter;
+ if (iter.CurrentPosition == 0) {
+ i = iter.Clone ();
+ i.MoveNext ();
+ }
+ XPathNavigator nav = i.Current;
+
+ object o = valueExpr.Evaluate (iter);
+ XPathNodeIterator it = o as XPathNodeIterator;
+ XsltContext ctx = iter.NamespaceManager as XsltContext;
+
+ BaseIterator result = null;
+
+ if (it != null) {
+ while (it.MoveNext()) {
+ ArrayList nodes = GetNodesByValue (
+ it.Current, it.Current.Value,
ctx);
+ if (nodes == null)
+ continue;
+ ListIterator tmp =
+ new ListIterator (nodes, ctx);
+ if (result == null)
+ result = tmp;
+ else
+ result = new UnionIterator (
+ iter, result, tmp);
+ }
+ }
+ else {
+ ArrayList nodes = GetNodesByValue (
+ nav, XPathFunctions.ToString (o), ctx);
+ if (nodes != null)
+ result = new ListIterator (nodes, ctx);
+ }
+
+ return result != null ? result : new NullIterator
(iter);
}
- void FindKeyMatch (string value, ArrayList result,
XPathNavigator context)
+ /*
+ void FindKeyMatch (string value, ArrayList result,
XPathNavigator context, XsltContext xsltContext)
{
- XPathNavigator searchDoc = context.Clone ();
+ XPathNavigator searchDoc = context;//.Clone ();
searchDoc.MoveToRoot ();
if (key != null) {
XPathNodeIterator desc =
searchDoc.SelectDescendants (XPathNodeType.All, true);
while (desc.MoveNext ()) {
- if (Matches (desc.Current, value))
+ if (Matches (desc.Current, value,
xsltContext))
AddResult (result,
desc.Current);
if (!desc.Current.MoveToFirstAttribute
())
continue;
do {
- if (Matches (desc.Current,
value))
+ if (Matches (desc.Current,
value, xsltContext))
AddResult (result,
desc.Current);
} while
(desc.Current.MoveToNextAttribute ());
@@ -261,5 +307,6 @@
}
result.Add (nav.Clone ());
}
+ */
}
}
\ No newline at end of file
Modified: trunk/mcs/class/System.XML/Mono.Xml.Xsl/XsltCompiledContext.cs
===================================================================
--- trunk/mcs/class/System.XML/Mono.Xml.Xsl/XsltCompiledContext.cs
2005-03-22 07:31:48 UTC (rev 42065)
+++ trunk/mcs/class/System.XML/Mono.Xml.Xsl/XsltCompiledContext.cs
2005-03-22 07:39:29 UTC (rev 42066)
@@ -83,6 +83,15 @@
return table.Evaluate (iter, valueExpr);
}
+ public bool MatchesKey (XPathNavigator nav,
+ IStaticXsltContext staticContext,
+ string name, string value)
+ {
+ QName qname = XslNameUtil.FromString (name,
staticContext);
+ KeyIndexTable table = GetIndexTable (qname);
+ return table.Matches (nav, value, this);
+ }
+
private QName GetKeyName (IStaticXsltContext staticContext,
BaseIterator iter, Expression nameExpr)
{
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches