Correction: XML catalog does not need to run for physical resolution pass. There was a problem in the XML validator's ValidatorHelper. resolve must always be called before resolvePhysical.
diff --git a/bundles/org.eclipse.wst.xml.core/plugin.xml b/bundles/org.eclipse.wst.xml.core/plugin.xml
index b0eb95e..081e6e8 100644
--- a/bundles/org.eclipse.wst.xml.core/plugin.xml
+++ b/bundles/org.eclipse.wst.xml.core/plugin.xml
@@ -43,10 +43,6 @@
             stage="postnormalization"
             class="org.eclipse.wst.xml.core.internal.catalog.XMLCatalogURIResolverExtension">
       </resolverExtension>
-      <resolverExtension
-            stage="physical"
-            class="org.eclipse.wst.xml.core.internal.catalog.XMLCatalogURIResolverExtension">
-      </resolverExtension>
    </extension>
 
 	<extension
diff --git a/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/ValidatorHelper.java b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/ValidatorHelper.java
index 86651b3..75ab917 100644
--- a/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/ValidatorHelper.java
+++ b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/ValidatorHelper.java
@@ -267,6 +267,7 @@
         }  
         if (rootElementNamespace != null)
         {
+          location = URIResolverPlugin.createResolver().resolve(null, rootElementNamespace, location);    
           location = URIResolverPlugin.createResolver().resolvePhysicalLocation(null, rootElementNamespace, location);                                          
         }