2003-12-16 Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
authorAtsushi Eno <atsushieno@gmail.com>
Thu, 18 Dec 2003 08:57:50 +0000 (08:57 -0000)
committerAtsushi Eno <atsushieno@gmail.com>
Thu, 18 Dec 2003 08:57:50 +0000 (08:57 -0000)
* Compiler.cs, XslTransformProcessor.cs :
  Use XmlValidatingReader to support id() for external stylesheets.
* XslKey.cs, XsltCompiledContext.cs :
  to evaluate MatchPattern and UsePattern, SetContext() is required.
* XslTemplate.cs : Forgot to commit. Change is below(12/16).

svn path=/trunk/mcs/; revision=21312

mcs/class/System.XML/Mono.Xml.Xsl/ChangeLog
mcs/class/System.XML/Mono.Xml.Xsl/Compiler.cs
mcs/class/System.XML/Mono.Xml.Xsl/XslKey.cs
mcs/class/System.XML/Mono.Xml.Xsl/XslTemplate.cs
mcs/class/System.XML/Mono.Xml.Xsl/XslTransformProcessor.cs
mcs/class/System.XML/Mono.Xml.Xsl/XsltCompiledContext.cs

index cfd0ce83eb69c49931df8cf73d9d1e9328bbb8c6..7218ee6517dff161fb827664c32b2709865aa1ee 100644 (file)
@@ -1,3 +1,11 @@
+2003-12-16 Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
+
+       * Compiler.cs, XslTransformProcessor.cs :
+         Use XmlValidatingReader to support id() for external stylesheets.
+       * XslKey.cs, XsltCompiledContext.cs :
+         to evaluate MatchPattern and UsePattern, SetContext() is required.
+       * XslTemplate.cs : Forgot to commit. Change is below(12/16).
+
 2003-12-16 Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
 
        * Emitter.cs, HtmlEmitter.cs, XmlWriterEmitter.cs :
index 44a5465f88ab1760039633b7ad70ecc58f99fbce..4c590a385008d93cbc3c9209c2e094934fc8b4e6 100644 (file)
@@ -169,7 +169,10 @@ namespace Mono.Xml.Xsl {
                        using (Stream s = (Stream)res.GetEntity (absUri, null, typeof(Stream)))
                        {
 
-                               XPathNavigator n = new XPathDocument (new XmlTextReader (absUri.ToString (), s), XmlSpace.Preserve).CreateNavigator ();
+                               XmlValidatingReader vr = new XmlValidatingReader (new XmlTextReader (absUri.ToString (), s));
+                               vr.ValidationType = ValidationType.None;
+                               XPathNavigator n = new XPathDocument (vr, XmlSpace.Preserve).CreateNavigator ();
+                               vr.Close ();
                                n.MoveToFirstChild ();
                                do {
                                        if (n.NodeType == XPathNodeType.Element)
index e6d3fa1e8a2be14c34d851f49c2f46192a51a2b2..1c5d4a26ca63d061890636d20359d2a91d4013e5 100644 (file)
@@ -42,9 +42,10 @@ namespace Mono.Xml.Xsl {
                public XPathExpression UsePattern { get { return usePattern; }}
                public XPathExpression MatchPattern { get { return matchPattern; }}
                
-               public bool Matches (XPathNavigator nav, string value)
+               public bool Matches (XPathNavigator nav, XmlNamespaceManager nsmgr, string value)
                {
-                       
+                       MatchPattern.SetContext (nsmgr);
+                       UsePattern.SetContext (nsmgr);
                        if (!nav.Matches (MatchPattern)) 
                                return false;
                        Debug.WriteLine ("? " + nav.Name);
index a1ebd126d0e5200e0ee3f8b5b525801b5c9de443..38a29c802295fe7232cc9373ceb06b96b9c1e599 100644 (file)
@@ -384,9 +384,12 @@ namespace Mono.Xml.Xsl {
                
                public override void Evaluate (XslTransformProcessor p, Hashtable withParams)
                {
-                       if (p.CurrentNode.NodeType == XPathNodeType.Whitespace && !p.PreserveWhitespace ())
-                               return;
-                       p.Out.WriteString (p.CurrentNode.Value);
+                       if (p.CurrentNode.NodeType == XPathNodeType.Whitespace) {
+                               if (p.PreserveWhitespace ())
+                                       p.Out.WriteWhitespace (p.CurrentNode.Value);
+                       }
+                       else
+                               p.Out.WriteString (p.CurrentNode.Value);
                }
        }
 }
index 9e02f20228d6c5da1b13f72357ffdb440db316b5..22d44836b3698f7ebc5e94ca734b61129f42672b 100644 (file)
@@ -102,8 +102,10 @@ namespace Mono.Xml.Xsl {
                        }
 
                        XmlReader rdr = new XmlTextReader (uri.ToString(), (Stream) resolver.GetEntity (uri, null, null));
-                       result = new XPathDocument (rdr, XmlSpace.Preserve).CreateNavigator ();
-                       rdr.Close ();
+                       XmlValidatingReader xvr = new XmlValidatingReader (rdr);
+                       xvr.ValidationType = ValidationType.None;
+                       result = new XPathDocument (xvr, XmlSpace.Preserve).CreateNavigator ();
+                       xvr.Close ();
                        
                        docCache [uri] = result.Clone ();
                        return result;
index ace588872ac43874c04baf4bfc3b463ce6aeb95c..a7a33f5cd3066c642716b281850d6259dca2530d 100644 (file)
@@ -678,6 +678,7 @@ namespace Mono.Xml.Xsl.Functions {
        class XsltKey : XPathFunction {
                Expression arg0, arg1;
                XmlNamespaceManager nsm;
+               XslKey key;
                
                public XsltKey (FunctionArguments args, IStaticXsltContext ctx) : base (args)
                {
@@ -696,34 +697,37 @@ namespace Mono.Xml.Xsl.Functions {
                {
                        ArrayList result = new ArrayList ();
                        QName name = XslNameUtil.FromString (arg0.EvaluateString (iter), nsm);
+                       XsltCompiledContext ctx = iter.NamespaceManager as XsltCompiledContext;
+                       if (key == null)
+                               key = ctx.Processor.CompiledStyle.Style.FindKey (name);
+
                        object o = arg1.Evaluate (iter);
                        XPathNodeIterator it = o as XPathNodeIterator;
                        
                        if (it != null) {
                                while (it.MoveNext())
-                                       FindKeyMatch ((iter.NamespaceManager as XsltCompiledContext), name, it.Current.Value, result, iter.Current);
+                                       FindKeyMatch (ctx, it.Current.Value, result, iter.Current);
                        } else {
-                               FindKeyMatch ((iter.NamespaceManager as XsltCompiledContext), name, XPathFunctions.ToString (o), result, iter.Current);
+                               FindKeyMatch (ctx, XPathFunctions.ToString (o), result, iter.Current);
                        }
                        
                        return new EnumeratorIterator (result.GetEnumerator (), (iter.NamespaceManager as XsltCompiledContext));
                }
                
-               void FindKeyMatch (XsltCompiledContext xsltContext, QName name, string value, ArrayList result, XPathNavigator context)
+               void FindKeyMatch (XsltCompiledContext xsltContext, string value, ArrayList result, XPathNavigator context)
                {
                        XPathNavigator searchDoc = context.Clone ();
                        searchDoc.MoveToRoot ();
-                       XslKey key = xsltContext.Processor.CompiledStyle.Style.FindKey (name);
                        if (key != null) {
                                XPathNodeIterator desc = searchDoc.SelectDescendants (XPathNodeType.All, true);
 
                                while (desc.MoveNext ()) {
-                                       if (key.Matches (desc.Current, value))
+                                       if (key.Matches (desc.Current, xsltContext, value))
                                                AddResult (result, desc.Current);
                                        
                                        if (desc.Current.MoveToFirstAttribute ()) {
                                                do {
-                                                       if (key.Matches (desc.Current, value))
+                                                       if (key.Matches (desc.Current, xsltContext, value))
                                                                AddResult (result, desc.Current);       
                                                } while (desc.Current.MoveToNextAttribute ());