001: /*
002: * Copyright 1999-2004 The Apache Software Foundation.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016: // $Id: JAXPPrefixResolver.java,v 1.1 2005/05/17 17:24:26 mkwan Exp $
017: package org.apache.xpath.jaxp;
018:
019: import org.w3c.dom.Node;
020: import org.w3c.dom.NamedNodeMap;
021: import org.apache.xml.utils.PrefixResolver;
022:
023: import javax.xml.namespace.NamespaceContext;
024:
025: /**
026: * <meta name="usage" content="general"/>
027: * This class implements a Default PrefixResolver which
028: * can be used to perform prefix-to-namespace lookup
029: * for the XPath object.
030: * This class delegates the resolution to the passed NamespaceContext
031: */
032: public class JAXPPrefixResolver implements PrefixResolver {
033:
034: private NamespaceContext namespaceContext;
035:
036: public JAXPPrefixResolver(NamespaceContext nsContext) {
037: this .namespaceContext = nsContext;
038: }
039:
040: public String getNamespaceForPrefix(String prefix) {
041: return namespaceContext.getNamespaceURI(prefix);
042: }
043:
044: /**
045: * Return the base identifier.
046: *
047: * @return null
048: */
049: public String getBaseIdentifier() {
050: return null;
051: }
052:
053: /**
054: * @see PrefixResolver#handlesNullPrefixes()
055: */
056: public boolean handlesNullPrefixes() {
057: return false;
058: }
059:
060: /**
061: * The URI for the XML namespace.
062: * (Duplicate of that found in org.apache.xpath.XPathContext).
063: */
064:
065: public static final String S_XMLNAMESPACEURI = "http://www.w3.org/XML/1998/namespace";
066:
067: /**
068: * Given a prefix and a Context Node, get the corresponding namespace.
069: * Warning: This will not work correctly if namespaceContext
070: * is an attribute node.
071: * @param prefix Prefix to resolve.
072: * @param namespaceContext Node from which to start searching for a
073: * xmlns attribute that binds a prefix to a namespace.
074: * @return Namespace that prefix resolves to, or null if prefix
075: * is not bound.
076: */
077: public String getNamespaceForPrefix(String prefix,
078: org.w3c.dom.Node namespaceContext) {
079: Node parent = namespaceContext;
080: String namespace = null;
081:
082: if (prefix.equals("xml")) {
083: namespace = S_XMLNAMESPACEURI;
084: } else {
085: int type;
086:
087: while ((null != parent)
088: && (null == namespace)
089: && (((type = parent.getNodeType()) == Node.ELEMENT_NODE) || (type == Node.ENTITY_REFERENCE_NODE))) {
090:
091: if (type == Node.ELEMENT_NODE) {
092: NamedNodeMap nnm = parent.getAttributes();
093:
094: for (int i = 0; i < nnm.getLength(); i++) {
095: Node attr = nnm.item(i);
096: String aname = attr.getNodeName();
097: boolean isPrefix = aname.startsWith("xmlns:");
098:
099: if (isPrefix || aname.equals("xmlns")) {
100: int index = aname.indexOf(':');
101: String p = isPrefix ? aname
102: .substring(index + 1) : "";
103:
104: if (p.equals(prefix)) {
105: namespace = attr.getNodeValue();
106: break;
107: }
108: }
109: }
110: }
111:
112: parent = parent.getParentNode();
113: }
114: }
115: return namespace;
116: }
117:
118: }
|