working on better error reporting of validity errors, especially providing

* error.c valid.c: working on better error reporting of validity
  errors, especially providing an accurate context.
* result/valid/xlink.xml.err result/valid/rss.xml.err: better
  error reports in those cases.
Daniel
diff --git a/valid.c b/valid.c
index 1e836d9..ca0d29d 100644
--- a/valid.c
+++ b/valid.c
@@ -311,23 +311,27 @@
 
 #define VECTXT(ctxt, node)					\
    if ((ctxt != NULL) && (ctxt->error != NULL) &&		\
-       (node != NULL) && (node->type == XML_ELEMENT_NODE)) {	\
-       if ((node->doc != NULL) && (node->doc->URL != NULL))	\
-	   ctxt->error(ctxt->userData, "%s:%d:", node->doc->URL,\
+       (node != NULL)) {					\
+       xmlChar *base = xmlNodeGetBase(NULL,node);		\
+       if (base != NULL) {					\
+	   ctxt->error(ctxt->userData, "%s:%d: ", base,		\
 		       (int) node->content);			\
-       else							\
-	   ctxt->error(ctxt->userData, ":%d:", 			\
+	   xmlFree(base);					\
+       } else							\
+	   ctxt->error(ctxt->userData, ":%d: ", 		\
 		       (int) node->content);			\
    }
 
 #define VWCTXT(ctxt, node)					\
    if ((ctxt != NULL) && (ctxt->warning != NULL) &&		\
-       (node != NULL) && (node->type == XML_ELEMENT_NODE)) {	\
-       if ((node->doc != NULL) && (node->doc->URL != NULL))	\
-	   ctxt->warning(ctxt->userData, "%s:%d:", node->doc->URL,\
+       (node != NULL)) {					\
+       xmlChar *base = xmlNodeGetBase(NULL,node);		\
+       if (base != NULL) {					\
+	   ctxt->warning(ctxt->userData, "%s:%d: ", base,	\
 		       (int) node->content);			\
-       else							\
-	   ctxt->warning(ctxt->userData, ":%d:", 		\
+	   xmlFree(base);					\
+       } else							\
+	   ctxt->warning(ctxt->userData, ":%d: ", 		\
 		       (int) node->content);			\
    }
 
@@ -1904,8 +1908,10 @@
 	/*
 	 * The id is already defined in this DTD.
 	 */
-	if (ctxt != NULL)
+	if (ctxt != NULL) {
+	    VECTXT(ctxt, attr->parent);
 	    VERROR(ctxt->userData, "ID %s already defined\n", value);
+	}
 	xmlFreeID(ret);
 	return(NULL);
     }
@@ -4786,6 +4792,7 @@
 	    if ((xmlStrEqual(doc->intSubset->name, BAD_CAST "HTML")) &&
 		(xmlStrEqual(root->name, BAD_CAST "html")))
 		goto name_ok;
+	    VECTXT(ctxt, root);
 	    VERROR(ctxt->userData,
 		   "Not valid: root and DTD name do not match '%s' and '%s'\n",
 		   root->name, doc->intSubset->name);
@@ -4874,6 +4881,7 @@
     if (attr->atype == XML_ATTRIBUTE_IDREF) {
 	id = xmlGetID(ctxt->doc, name);
 	if (id == NULL) {
+	    VECTXT(ctxt, attr->parent);
 	    VERROR(ctxt->userData, 
 	       "IDREF attribute %s references an unknown ID \"%s\"\n",
 		   attr->name, name);
@@ -4895,6 +4903,7 @@
 	    *cur = 0;
 	    id = xmlGetID(ctxt->doc, str);
 	    if (id == NULL) {
+		VECTXT(ctxt, attr->parent);
 		VERROR(ctxt->userData, 
 	       "IDREFS attribute %s references an unknown ID \"%s\"\n",
 		       attr->name, str);