package client.net.sf.saxon.ce.om;
import client.net.sf.saxon.ce.tree.iter.AxisIterator;
import client.net.sf.saxon.ce.tree.util.NamespaceIterator;
import client.net.sf.saxon.ce.type.Type;
import java.util.Iterator;
/**
* A NamespaceResolver that resolves namespace prefixes by reference to a node in a document for which
* those namespaces are in-scope.
*/
public class InscopeNamespaceResolver implements NamespaceResolver {
private NodeInfo node;
/**
* Create a NamespaceResolver that resolves according to the in-scope namespaces
* of a given node
* @param node the given node
*/
public InscopeNamespaceResolver(NodeInfo node) {
if (node.getNodeKind() == Type.ELEMENT) {
this.node = node;
} else {
this.node = node.getParent();
}
}
/**
* Get the namespace URI corresponding to a given prefix. Return null
* if the prefix is not in scope.
*
* @param prefix the namespace prefix
* @param useDefault true if the default namespace is to be used when the
* prefix is ""
* @return the uri for the namespace, or null if the prefix is not in scope
* Return "" for the no-namespace.
*/
public String getURIForPrefix(String prefix, boolean useDefault) {
if ("".equals(prefix) && !useDefault) {
return "";
}
AxisIterator iter = node.iterateAxis(Axis.NAMESPACE);
while (true) {
NodeInfo node = (NodeInfo)iter.next();
if (node == null) {
break;
}
if (node.getLocalPart().equals(prefix)) {
return node.getStringValue();
}
}
if ("".equals(prefix)) {
return "";
} else {
return null;
}
}
/**
* Get an iterator over all the prefixes declared in this namespace context. This will include
* the default namespace (prefix="") and the XML namespace where appropriate
*/
public Iterator iteratePrefixes() {
final NamePool pool = node.getNamePool();
return new Iterator() {
int phase = 0;
Iterator<NamespaceBinding> iter = NamespaceIterator.iterateNamespaces(node);
public boolean hasNext() {
if (iter.hasNext()) {
return true;
} else if (phase == 0) {
phase = 1;
return true;
} else {
return false;
}
}
public Object next() {
if (phase == 1) {
phase = 2;
return "xml";
} else {
return iter.next().getPrefix();
}
}
public void remove() {
throw new UnsupportedOperationException("remove");
}
};
}
/**
* Get the node on which this namespace resolver is based
* @return the node on which this namespace resolver is based
*/
public NodeInfo getNode() {
return node;
}
}
// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
// If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
// This Source Code Form is “Incompatible With Secondary Licenses”, as defined by the Mozilla Public License, v. 2.0.