Способ, которым вы выбираете родительский узел, нуждается в исправлении: используйте find
, чтобы найти его, затем используйте children
для этого результата (без аргумента), чтобы получить все дочерние элементы.
Если родительский узелкорень XML, тогда find
не найдет его, но с addBack
вы также можете включить корневой узел в совпадение.
Я бы также использовал camelCase для имен ваших функций и использовал jQueryфункции для построения динамического HTML.
Вот как это может выглядеть:
var $xml = $("<aa><bb></bb><cc></cc><dd></dd><ee></ee></aa>");
var className = "someClass"
//check allowed child of front tag
checkChildAllowed($xml, "aa", ["bb","cc","dd"], "RULE_002", "Fail");
//Function to check the x tag have only the allowed child y
function checkChildAllowed($xml, parent, allowedChildren, rule, errorType) {
// Make sure to first locate the parent correctly:
var $parent = $xml.find(parent).addBack(parent);
// Uppercase tag names as jQuery uses that HTML convention
allowedChildren = allowedChildren.map(childName => childName.toUpperCase());
$parent.children().each(function () {
if (allowedChildren.includes(this.nodeName)) return; // tag is OK
// Include this if that function is defined:
//check_total_error_warning(error_type);
$("#validation_report").append( // Use jQuery functions
$("<tr>").addClass("err").append(
$("<td>").append(
$("<a>").attr("href", "Asset\Rules\Rule.html\#"+rule).text(rule)
),
$("<td>").append(
$("<span>").addClass("highlight")
.text("<"+this.nodeName.toLowerCase()+">"),
" is not allowed inside the ",
$("<span>").addClass("highlight").text("<"+parent+">"),
" element"
),
$("<td>").addClass(className).text(errorType)
)
);
});
}
table { border-collapse: collapse }
td { border: 1px solid; padding: 5px }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table id="validation_report"></table>