findAncestorNs function

List<XmlNamespace> findAncestorNs(
  1. XmlDocument doc,
  2. String docSubsetXpath, [
  3. dynamic namespaceResolver
])

Implementation

List<XmlNamespace> findAncestorNs(XmlDocument doc, String docSubsetXpath,
    [namespaceResolver]) {
  final docSubset = XPath(XmlNodeTree(doc))
      .query(docSubsetXpath); // FIXME: supports namespaceResolver
  final result = docSubset.node;
  if (result == null) {
    return [];
  }

  final node = result.node;
  final ancestorNs = _collectAncestorNamespaces(node);
  final ancestorNsWithoutDuplicate = <XmlNamespace>[];
  for (final ns in ancestorNs) {
    var notOnTheList = true;

    for (final ns2 in ancestorNsWithoutDuplicate) {
      if (ns2.prefix == ns.prefix) {
        notOnTheList = false;
        break;
      }
    }

    if (notOnTheList) {
      ancestorNsWithoutDuplicate.add(ns);
    }
  }

  final returningNs = <XmlNamespace>[];
  final subsetAttributes = node.attributes;

  for (var a in ancestorNsWithoutDuplicate) {
    var isUnique = true;
    for (var b in subsetAttributes) {
      var nodeName = b.name.qualified;
      if (!nodeName.startsWith('xmlns:')) continue;

      final prefix = nodeName.substring(6);
      if (prefix == a.prefix) {
        isUnique = false;
        break;
      }
    }

    if (isUnique) {
      returningNs.add(a);
    }
  }

  return returningNs;
}