+ public QName getName() {
+ return toQName(this.element);
+ }
+
+ protected QName toQName(Node node) {
+ String prefix = node.getPrefix();
+ if (prefix == null) {
+ String namespaceURI = node.getNamespaceURI();
+ if (namespaceURI == null)
+ namespaceURI = node.getOwnerDocument().lookupNamespaceURI(null);
+ if (namespaceURI == null) {
+ return toQName(node, node.getLocalName());
+ } else {
+ String contextPrefix = session.getPrefix(namespaceURI);
+ if (contextPrefix == null)
+ throw new IllegalStateException("Namespace " + namespaceURI + " is unbound");
+ return toQName(node, namespaceURI, node.getLocalName(), session);
+ }
+ } else {
+ String namespaceURI = node.getNamespaceURI();
+ if (namespaceURI == null)
+ namespaceURI = node.getOwnerDocument().lookupNamespaceURI(prefix);
+ if (namespaceURI == null) {
+ namespaceURI = session.getNamespaceURI(prefix);
+ if (XMLConstants.NULL_NS_URI.equals(namespaceURI))
+ throw new IllegalStateException("Prefix " + prefix + " is unbound");
+ // TODO bind the prefix in the document?
+ }
+ return toQName(node, namespaceURI, node.getLocalName(), session);
+ }
+ }
+
+ protected QName toQName(Node source, String namespaceURI, String localName, NamespaceContext namespaceContext) {
+ return new ContentName(namespaceURI, localName, session);
+ }
+
+ protected QName toQName(Node source, String localName) {
+ return new ContentName(localName);