xml parser CHANGE simplify processing of element tag termination

Move detection of > and /> into the lyxml_get_string() to avoid need of
calling lyxml_get_attribute when there is no other attribute. Also fixes
a problem of not removing element name from the stack of opened elements
when /> was reached on empty element with attributes.
diff --git a/tests/src/test_xml.c b/tests/src/test_xml.c
index 33a417f..587fe67 100644
--- a/tests/src/test_xml.c
+++ b/tests/src/test_xml.c
@@ -74,8 +74,11 @@
     (void) state; /* unused */
 
     size_t name_len, prefix_len;
+    size_t buf_len, len;
     const char *name, *prefix;
+    char *buf = NULL, *out = NULL;
     const char *str, *p;
+    int dynamic;
 
     struct lyxml_context ctx;
     memset(&ctx, 0, sizeof ctx);
@@ -117,6 +120,21 @@
     assert_int_equal(7, name_len);
     assert_int_equal(LYXML_ELEMENT, ctx.status);
     assert_string_equal("", str);
+    assert_int_equal(0, ctx.elements.count);
+
+    str = "  <  element attr=\'x\'/>";
+    assert_int_equal(LY_SUCCESS, lyxml_get_element(&ctx, &str, &prefix, &prefix_len, &name, &name_len));
+    assert_int_equal(LYXML_ATTRIBUTE, ctx.status);
+    assert_string_equal("attr=\'x\'/>", str);
+    assert_int_equal(1, ctx.elements.count);
+    assert_int_equal(LY_SUCCESS, lyxml_get_attribute(&ctx, &str, &prefix, &prefix_len, &name, &name_len));
+    assert_int_equal(LYXML_ATTR_CONTENT, ctx.status);
+    assert_string_equal("\'x\'/>", str);
+    assert_int_equal(1, ctx.elements.count);
+    assert_int_equal(LY_SUCCESS, lyxml_get_string(&ctx, &str, &buf, &buf_len, &out, &len, &dynamic));
+    assert_int_equal(LYXML_ELEMENT, ctx.status);
+    assert_string_equal("", str);
+    assert_int_equal(0, ctx.elements.count);
 
     str = "<?xml version=\"1.0\"?>  <!-- comment --> <![CDATA[<greeting>Hello, world!</greeting>]]> <?TEST xxx?> <element/>";
     assert_int_equal(LY_SUCCESS, lyxml_get_element(&ctx, &str, &prefix, &prefix_len, &name, &name_len));
@@ -200,18 +218,6 @@
     str = "";
     assert_int_equal(LY_EINVAL, lyxml_get_attribute(&ctx, &str, &prefix, &prefix_len, &name, &name_len));
 
-    /* empty - without element tag termination */
-    str = "   />";
-    assert_int_equal(LY_SUCCESS, lyxml_get_attribute(&ctx, &str, &prefix, &prefix_len, &name, &name_len));
-    assert_null(name);
-    assert_true(str[0] == '\0');
-    assert_int_equal(LYXML_ELEMENT, ctx.status);
-    str = ">";
-    assert_int_equal(LY_SUCCESS, lyxml_get_attribute(&ctx, &str, &prefix, &prefix_len, &name, &name_len));
-    assert_null(name);
-    assert_true(str[0] == '\0');
-    assert_int_equal(LYXML_ELEM_CONTENT, ctx.status);
-
     /* not an attribute */
     str = p = "unknown/>";
     assert_int_equal(LY_EVALID, lyxml_get_attribute(&ctx, &str, &prefix, &prefix_len, &name, &name_len));
@@ -241,7 +247,7 @@
     assert_string_equal("\"urn\">", str);
     assert_int_equal(LYXML_ATTR_CONTENT, ctx.status);
 
-    str = "xmlns:nc\n = \'urn\'>";
+    str = "xmlns:nc\n = \'urn\'/>";
     assert_int_equal(LY_SUCCESS, lyxml_get_attribute(&ctx, &str, &prefix, &prefix_len, &name, &name_len));
     assert_non_null(name);
     assert_non_null(prefix);
@@ -250,8 +256,9 @@
     assert_int_equal(3, ctx.line);
     assert_false(strncmp("xmlns", prefix, prefix_len));
     assert_false(strncmp("nc", name, name_len));
-    assert_string_equal("\'urn\'>", str);
+    assert_string_equal("\'urn\'/>", str);
     assert_int_equal(LYXML_ATTR_CONTENT, ctx.status);
+
 }
 
 static void