parser xml FEATURE add attribute to unknown xml prefix message

... and rewrite LYDXML_LOG_NAMESPACE_ERR to function.
diff --git a/src/parser_xml.c b/src/parser_xml.c
index 435203e..34d6fdc 100644
--- a/src/parser_xml.c
+++ b/src/parser_xml.c
@@ -40,13 +40,6 @@
 #include "validation.h"
 #include "xml.h"
 
-#define LYDXML_LOG_NAMESPACE_ERR(XMLCTX, PREFIX, PREFIX_LEN) \
-        if (PREFIX_LEN) { \
-            LOGVAL(XMLCTX->ctx, LYVE_REFERENCE, "Unknown XML prefix \"%.*s\".", (int)PREFIX_LEN, PREFIX); \
-        } else { \
-            LOGVAL(XMLCTX->ctx, LYVE_REFERENCE, "Missing XML namespace."); \
-        }
-
 static LY_ERR lydxml_subtree_r(struct lyd_xml_ctx *lydctx, struct lyd_node *parent, struct lyd_node **first_p,
         struct ly_set *parsed);
 
@@ -61,6 +54,30 @@
 }
 
 /**
+ * @brief Log namespace error.
+ *
+ * @param[in] xmlctx XML context
+ * @param[in] prefix XML prefix.
+ * @param[in] prefix_len XML prefix length.
+ * @param[in] attr_name Current XML attribute name.
+ * @param[in] attr_len Current XML attribute name length.
+ */
+static void
+lydxml_log_namespace_err(struct lyxml_ctx *xmlctx, const char *prefix, size_t prefix_len,
+        const char *attr_name, size_t attr_len)
+{
+    if (prefix_len && attr_len) {
+        LOGVAL(xmlctx->ctx, LYVE_REFERENCE, "Unknown XML prefix \"%.*s\" at attribute \"%.*s\".",
+                (int)prefix_len, prefix, (int)attr_len, attr_name);
+    } else if (prefix_len) {
+        LOGVAL(xmlctx->ctx, LYVE_REFERENCE, "Unknown XML prefix \"%.*s\".",
+                (int)prefix_len, prefix);
+    } else {
+        LOGVAL(xmlctx->ctx, LYVE_REFERENCE, "Missing XML namespace.");
+    }
+}
+
+/**
  * @brief Parse and create XML metadata.
  *
  * @param[in] lydctx XML data parser context.
@@ -132,7 +149,7 @@
         /* get namespace of the attribute to find its annotation definition */
         ns = lyxml_ns_get(&xmlctx->ns, xmlctx->prefix, xmlctx->prefix_len);
         if (!ns) {
-            LYDXML_LOG_NAMESPACE_ERR(xmlctx, xmlctx->prefix, xmlctx->prefix_len);
+            lydxml_log_namespace_err(xmlctx, xmlctx->prefix, xmlctx->prefix_len, xmlctx->name, xmlctx->name_len);
             ret = LY_ENOTFOUND;
             goto cleanup;
         }
@@ -223,7 +240,7 @@
         if (prefix_len) {
             ns = lyxml_ns_get(&xmlctx->ns, prefix, prefix_len);
             if (!ns) {
-                LYDXML_LOG_NAMESPACE_ERR(xmlctx, prefix, prefix_len);
+                lydxml_log_namespace_err(xmlctx, prefix, prefix_len, name, name_len);
                 ret = LY_EVALID;
                 goto cleanup;
             }
@@ -545,7 +562,7 @@
         if (lydctx->int_opts & LYD_INTOPT_ANY) {
             goto unknown_module;
         }
-        LYDXML_LOG_NAMESPACE_ERR(xmlctx, prefix, prefix_len);
+        lydxml_log_namespace_err(xmlctx, prefix, prefix_len, NULL, 0);
         return LY_EVALID;
     }
 
@@ -1179,7 +1196,7 @@
     prefix_len = xmlctx->prefix_len;
     ns = lyxml_ns_get(&xmlctx->ns, prefix, prefix_len);
     if (!ns) {
-        LYDXML_LOG_NAMESPACE_ERR(xmlctx, prefix, prefix_len);
+        lydxml_log_namespace_err(xmlctx, prefix, prefix_len, NULL, 0);
         return LY_EVALID;
     } else if (strcmp(ns->uri, uri)) {
         /* different namespace */
@@ -1403,7 +1420,7 @@
     prefix_len = xmlctx->prefix_len;
     ns = lyxml_ns_get(&xmlctx->ns, prefix, prefix_len);
     if (!ns) {
-        LYDXML_LOG_NAMESPACE_ERR(xmlctx, prefix, prefix_len);
+        lydxml_log_namespace_err(xmlctx, prefix, prefix_len, NULL, 0);
         return LY_EVALID;
     }
 
diff --git a/tests/utests/data/test_parser_xml.c b/tests/utests/data/test_parser_xml.c
index 28c3770..d7203fa 100644
--- a/tests/utests/data/test_parser_xml.c
+++ b/tests/utests/data/test_parser_xml.c
@@ -361,7 +361,7 @@
             "  <c xmld:id=\"D\">1</c>\n"
             "</a>\n",
             LYD_XML, LYD_PARSE_OPAQ, LYD_VALIDATE_PRESENT, &tree));
-    CHECK_LOG_CTX("Unknown XML prefix \"xmld\".", "/a", 3);
+    CHECK_LOG_CTX("Unknown XML prefix \"xmld\" at attribute \"id\".", "/a", 3);
 }
 
 static void