2005-11-17 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / mcs / class / System.XML / Mono.Xml.Xsl / XslFunctions.cs
old mode 100755 (executable)
new mode 100644 (file)
index 1c8d068..cf061cc
@@ -262,35 +262,45 @@ namespace Mono.Xml.Xsl
                XPathNodeIterator GetDocument (XsltCompiledContext xsltContext, XPathNodeIterator itr, string baseUri)
                {
                        ArrayList list = new ArrayList ();
-                       Hashtable got = new Hashtable ();
+                       try {
+                               Hashtable got = new Hashtable ();
                        
-                       while (itr.MoveNext()) {
-                               Uri uri = Resolve (itr.Current.Value, baseUri != null ? baseUri : /*itr.Current.BaseURI*/doc.BaseURI, xsltContext.Processor);
-                               if (!got.ContainsKey (uri)) {
-                                       got.Add (uri, null);
-                                       if (uri != null && uri.ToString () == "") {
-                                               XPathNavigator n = doc.Clone ();
-                                               n.MoveToRoot ();
-                                               list.Add (n);
-                                       } else
-                                               list.Add (xsltContext.Processor.GetDocument (uri));
+                               while (itr.MoveNext()) {
+                                       Uri uri = Resolve (itr.Current.Value, baseUri != null ? baseUri : /*itr.Current.BaseURI*/doc.BaseURI, xsltContext.Processor);
+                                       if (!got.ContainsKey (uri)) {
+                                               got.Add (uri, null);
+                                               if (uri != null && uri.ToString () == "") {
+                                                       XPathNavigator n = doc.Clone ();
+                                                       n.MoveToRoot ();
+                                                       list.Add (n);
+                                               } else
+                                                       list.Add (xsltContext.Processor.GetDocument (uri));
+                                       }
                                }
+                       } catch (Exception) {
+                               // Error recovery.
+                               // See http://www.w3.org/TR/xslt#document and
+                               // bug #75663.
+                               list.Clear ();
                        }
-                       
                        return new ListIterator (list, xsltContext);
                }
        
                XPathNodeIterator GetDocument (XsltCompiledContext xsltContext, string arg0, string baseUri)
                {
-                       Uri uri = Resolve (arg0, baseUri != null ? baseUri : doc.BaseURI, xsltContext.Processor);
-                       XPathNavigator n;
-                       if (uri != null && uri.ToString () == "") {
-                               n = doc.Clone ();
-                               n.MoveToRoot ();
-                       } else
-                               n = xsltContext.Processor.GetDocument (uri);
+                       try {
+                               Uri uri = Resolve (arg0, baseUri != null ? baseUri : doc.BaseURI, xsltContext.Processor);
+                               XPathNavigator n;
+                               if (uri != null && uri.ToString () == "") {
+                                       n = doc.Clone ();
+                                       n.MoveToRoot ();
+                               } else
+                                       n = xsltContext.Processor.GetDocument (uri);
                        
-                       return new SelfIterator (n, xsltContext);
+                               return new SelfIterator (n, xsltContext);
+                       } catch (Exception) {
+                               return new ListIterator (new ArrayList (), xsltContext);
+                       }
                }
 
                public override string ToString ()