@Override
	public List<Namespace> getNamespacesIntroduced() {
		if (getParentElement() == null) {
			// we introduce everything... except Namespace.XML_NAMESPACE
			List<Namespace> ret = new ArrayList<Namespace>(getNamespacesInScope());
			for (Iterator<Namespace> it = ret.iterator(); it.hasNext(); ) {
				Namespace ns = it.next();
				if (ns == Namespace.XML_NAMESPACE || ns == Namespace.NO_NAMESPACE) {
					it.remove();
				}
			}
			return Collections.unmodifiableList(ret);
		}

		// OK, the things we introduce are the prefixes we have in scope that
		// are *not* in our parent's scope.
		HashMap<String,Namespace> parents = new HashMap<String, Namespace>();
		for (Namespace ns : getParentElement().getNamespacesInScope()) {
			parents.put(ns.getPrefix(), ns);
		}

		ArrayList<Namespace> al = new ArrayList<Namespace>();
		for (Namespace ns : getNamespacesInScope()) {
			if (!parents.containsKey(ns.getPrefix()) || ns != parents.get(ns.getPrefix())) {
				// introduced
				al.add(ns);
			}
		}

		return Collections.unmodifiableList(al);
	}