|
|
|
|
|
*/ |
|
/* |
|
* Licensed to the Apache Software Foundation (ASF) under one or more |
|
* contributor license agreements. See the NOTICE file distributed with |
|
* this work for additional information regarding copyright ownership. |
|
* The ASF licenses this file to You under the Apache License, Version 2.0 |
|
* (the "License"); you may not use this file except in compliance with |
|
* the License. You may obtain a copy of the License at |
|
* |
|
* http://www.apache.org/licenses/LICENSE-2.0 |
|
* |
|
* Unless required by applicable law or agreed to in writing, software |
|
* distributed under the License is distributed on an "AS IS" BASIS, |
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
* See the License for the specific language governing permissions and |
|
* limitations under the License. |
|
*/ |
|
|
|
package com.sun.org.apache.xerces.internal.impl; |
|
|
|
import com.sun.org.apache.xerces.internal.impl.msg.XMLMessageFormatter; |
|
import com.sun.org.apache.xerces.internal.util.SymbolTable; |
|
import com.sun.org.apache.xerces.internal.util.XMLSymbols; |
|
import com.sun.org.apache.xerces.internal.xni.Augmentations; |
|
import com.sun.org.apache.xerces.internal.xni.NamespaceContext; |
|
import com.sun.org.apache.xerces.internal.xni.QName; |
|
import com.sun.org.apache.xerces.internal.xni.XMLAttributes; |
|
import com.sun.org.apache.xerces.internal.xni.XMLDocumentHandler; |
|
import com.sun.org.apache.xerces.internal.xni.XMLLocator; |
|
import com.sun.org.apache.xerces.internal.xni.XMLResourceIdentifier; |
|
import com.sun.org.apache.xerces.internal.xni.XMLString; |
|
import com.sun.org.apache.xerces.internal.xni.XNIException; |
|
import com.sun.org.apache.xerces.internal.xni.parser.XMLComponent; |
|
import com.sun.org.apache.xerces.internal.xni.parser.XMLComponentManager; |
|
import com.sun.org.apache.xerces.internal.xni.parser.XMLConfigurationException; |
|
import com.sun.org.apache.xerces.internal.xni.parser.XMLDocumentFilter; |
|
import com.sun.org.apache.xerces.internal.xni.parser.XMLDocumentSource; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public class XMLNamespaceBinder |
|
implements XMLComponent, XMLDocumentFilter { |
|
|
|
// |
|
// Constants |
|
// |
|
|
|
// feature identifiers |
|
|
|
|
|
protected static final String NAMESPACES = |
|
Constants.SAX_FEATURE_PREFIX + Constants.NAMESPACES_FEATURE; |
|
|
|
// property identifiers |
|
|
|
|
|
protected static final String SYMBOL_TABLE = |
|
Constants.XERCES_PROPERTY_PREFIX + Constants.SYMBOL_TABLE_PROPERTY; |
|
|
|
|
|
protected static final String ERROR_REPORTER = |
|
Constants.XERCES_PROPERTY_PREFIX + Constants.ERROR_REPORTER_PROPERTY; |
|
|
|
// recognized features and properties |
|
|
|
|
|
private static final String[] RECOGNIZED_FEATURES = { |
|
NAMESPACES, |
|
}; |
|
|
|
|
|
private static final Boolean[] FEATURE_DEFAULTS = { |
|
null, |
|
}; |
|
|
|
|
|
private static final String[] RECOGNIZED_PROPERTIES = { |
|
SYMBOL_TABLE, |
|
ERROR_REPORTER, |
|
}; |
|
|
|
|
|
private static final Object[] PROPERTY_DEFAULTS = { |
|
null, |
|
null, |
|
}; |
|
|
|
// |
|
// Data |
|
// |
|
|
|
// features |
|
|
|
|
|
protected boolean fNamespaces; |
|
|
|
// properties |
|
|
|
|
|
protected SymbolTable fSymbolTable; |
|
|
|
|
|
protected XMLErrorReporter fErrorReporter; |
|
|
|
// handlers |
|
|
|
|
|
protected XMLDocumentHandler fDocumentHandler; |
|
|
|
protected XMLDocumentSource fDocumentSource; |
|
|
|
// settings |
|
|
|
|
|
protected boolean fOnlyPassPrefixMappingEvents; |
|
|
|
// shared context |
|
|
|
|
|
private NamespaceContext fNamespaceContext; |
|
|
|
// temp vars |
|
|
|
|
|
private QName fAttributeQName = new QName(); |
|
|
|
// |
|
// Constructors |
|
// |
|
|
|
|
|
public XMLNamespaceBinder() { |
|
} // <init>() |
|
|
|
// |
|
// Public methods |
|
// |
|
|
|
// settings |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public void setOnlyPassPrefixMappingEvents(boolean onlyPassPrefixMappingEvents) { |
|
fOnlyPassPrefixMappingEvents = onlyPassPrefixMappingEvents; |
|
} // setOnlyPassPrefixMappingEvents(boolean) |
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public boolean getOnlyPassPrefixMappingEvents() { |
|
return fOnlyPassPrefixMappingEvents; |
|
} // getOnlyPassPrefixMappingEvents():boolean |
|
|
|
// |
|
// XMLComponent methods |
|
// |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public void reset(XMLComponentManager componentManager) |
|
throws XNIException { |
|
|
|
|
|
fNamespaces = componentManager.getFeature(NAMESPACES, true); |
|
|
|
|
|
fSymbolTable = (SymbolTable)componentManager.getProperty(SYMBOL_TABLE); |
|
fErrorReporter = (XMLErrorReporter)componentManager.getProperty(ERROR_REPORTER); |
|
|
|
} // reset(XMLComponentManager) |
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public String[] getRecognizedFeatures() { |
|
return RECOGNIZED_FEATURES.clone(); |
|
} // getRecognizedFeatures():String[] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public void setFeature(String featureId, boolean state) |
|
throws XMLConfigurationException { |
|
} // setFeature(String,boolean) |
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public String[] getRecognizedProperties() { |
|
return RECOGNIZED_PROPERTIES.clone(); |
|
} // getRecognizedProperties():String[] |
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public void setProperty(String propertyId, Object value) |
|
throws XMLConfigurationException { |
|
|
|
|
|
if (propertyId.startsWith(Constants.XERCES_PROPERTY_PREFIX)) { |
|
final int suffixLength = propertyId.length() - Constants.XERCES_PROPERTY_PREFIX.length(); |
|
|
|
if (suffixLength == Constants.SYMBOL_TABLE_PROPERTY.length() && |
|
propertyId.endsWith(Constants.SYMBOL_TABLE_PROPERTY)) { |
|
fSymbolTable = (SymbolTable)value; |
|
} |
|
else if (suffixLength == Constants.ERROR_REPORTER_PROPERTY.length() && |
|
propertyId.endsWith(Constants.ERROR_REPORTER_PROPERTY)) { |
|
fErrorReporter = (XMLErrorReporter)value; |
|
} |
|
return; |
|
} |
|
|
|
} // setProperty(String,Object) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public Boolean getFeatureDefault(String featureId) { |
|
for (int i = 0; i < RECOGNIZED_FEATURES.length; i++) { |
|
if (RECOGNIZED_FEATURES[i].equals(featureId)) { |
|
return FEATURE_DEFAULTS[i]; |
|
} |
|
} |
|
return null; |
|
} // getFeatureDefault(String):Boolean |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public Object getPropertyDefault(String propertyId) { |
|
for (int i = 0; i < RECOGNIZED_PROPERTIES.length; i++) { |
|
if (RECOGNIZED_PROPERTIES[i].equals(propertyId)) { |
|
return PROPERTY_DEFAULTS[i]; |
|
} |
|
} |
|
return null; |
|
} // getPropertyDefault(String):Object |
|
|
|
// |
|
// XMLDocumentSource methods |
|
// |
|
|
|
|
|
public void setDocumentHandler(XMLDocumentHandler documentHandler) { |
|
fDocumentHandler = documentHandler; |
|
} // setDocumentHandler(XMLDocumentHandler) |
|
|
|
|
|
public XMLDocumentHandler getDocumentHandler() { |
|
return fDocumentHandler; |
|
} // setDocumentHandler(XMLDocumentHandler) |
|
|
|
|
|
// |
|
// XMLDocumentHandler methods |
|
// |
|
|
|
|
|
public void setDocumentSource(XMLDocumentSource source){ |
|
fDocumentSource = source; |
|
} // setDocumentSource |
|
|
|
|
|
public XMLDocumentSource getDocumentSource (){ |
|
return fDocumentSource; |
|
} // getDocumentSource |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public void startGeneralEntity(String name, |
|
XMLResourceIdentifier identifier, |
|
String encoding, Augmentations augs) |
|
throws XNIException { |
|
if (fDocumentHandler != null && !fOnlyPassPrefixMappingEvents) { |
|
fDocumentHandler.startGeneralEntity(name, identifier, encoding, augs); |
|
} |
|
} // startEntity(String,String,String,String,String) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public void textDecl(String version, String encoding, Augmentations augs) |
|
throws XNIException { |
|
if (fDocumentHandler != null && !fOnlyPassPrefixMappingEvents) { |
|
fDocumentHandler.textDecl(version, encoding, augs); |
|
} |
|
} // textDecl(String,String) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public void startDocument(XMLLocator locator, String encoding, |
|
NamespaceContext namespaceContext, Augmentations augs) |
|
throws XNIException { |
|
fNamespaceContext = namespaceContext; |
|
|
|
if (fDocumentHandler != null && !fOnlyPassPrefixMappingEvents) { |
|
fDocumentHandler.startDocument(locator, encoding, namespaceContext, augs); |
|
} |
|
} // startDocument(XMLLocator,String) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public void xmlDecl(String version, String encoding, String standalone, Augmentations augs) |
|
throws XNIException { |
|
if (fDocumentHandler != null && !fOnlyPassPrefixMappingEvents) { |
|
fDocumentHandler.xmlDecl(version, encoding, standalone, augs); |
|
} |
|
} // xmlDecl(String,String,String) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public void doctypeDecl(String rootElement, |
|
String publicId, String systemId, Augmentations augs) |
|
throws XNIException { |
|
if (fDocumentHandler != null && !fOnlyPassPrefixMappingEvents) { |
|
fDocumentHandler.doctypeDecl(rootElement, publicId, systemId, augs); |
|
} |
|
} // doctypeDecl(String,String,String) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public void comment(XMLString text, Augmentations augs) throws XNIException { |
|
if (fDocumentHandler != null && !fOnlyPassPrefixMappingEvents) { |
|
fDocumentHandler.comment(text, augs); |
|
} |
|
} // comment(XMLString) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public void processingInstruction(String target, XMLString data, Augmentations augs) |
|
throws XNIException { |
|
if (fDocumentHandler != null && !fOnlyPassPrefixMappingEvents) { |
|
fDocumentHandler.processingInstruction(target, data, augs); |
|
} |
|
} // processingInstruction(String,XMLString) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public void startElement(QName element, XMLAttributes attributes, Augmentations augs) |
|
throws XNIException { |
|
|
|
if (fNamespaces) { |
|
handleStartElement(element, attributes, augs, false); |
|
} |
|
else if (fDocumentHandler != null) { |
|
fDocumentHandler.startElement(element, attributes, augs); |
|
} |
|
|
|
|
|
} // startElement(QName,XMLAttributes) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public void emptyElement(QName element, XMLAttributes attributes, Augmentations augs) |
|
throws XNIException { |
|
|
|
if (fNamespaces) { |
|
handleStartElement(element, attributes, augs, true); |
|
handleEndElement(element, augs, true); |
|
} |
|
else if (fDocumentHandler != null) { |
|
fDocumentHandler.emptyElement(element, attributes, augs); |
|
} |
|
|
|
} // emptyElement(QName,XMLAttributes) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public void characters(XMLString text, Augmentations augs) throws XNIException { |
|
if (fDocumentHandler != null && !fOnlyPassPrefixMappingEvents) { |
|
fDocumentHandler.characters(text, augs); |
|
} |
|
} // characters(XMLString) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public void ignorableWhitespace(XMLString text, Augmentations augs) throws XNIException { |
|
if (fDocumentHandler != null && !fOnlyPassPrefixMappingEvents) { |
|
fDocumentHandler.ignorableWhitespace(text, augs); |
|
} |
|
} // ignorableWhitespace(XMLString) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public void endElement(QName element, Augmentations augs) throws XNIException { |
|
|
|
if (fNamespaces) { |
|
handleEndElement(element, augs, false); |
|
} |
|
else if (fDocumentHandler != null) { |
|
fDocumentHandler.endElement(element, augs); |
|
} |
|
|
|
} // endElement(QName) |
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public void startCDATA(Augmentations augs) throws XNIException { |
|
if (fDocumentHandler != null && !fOnlyPassPrefixMappingEvents) { |
|
fDocumentHandler.startCDATA(augs); |
|
} |
|
} // startCDATA() |
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public void endCDATA(Augmentations augs) throws XNIException { |
|
if (fDocumentHandler != null && !fOnlyPassPrefixMappingEvents) { |
|
fDocumentHandler.endCDATA(augs); |
|
} |
|
} // endCDATA() |
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public void endDocument(Augmentations augs) throws XNIException { |
|
if (fDocumentHandler != null && !fOnlyPassPrefixMappingEvents) { |
|
fDocumentHandler.endDocument(augs); |
|
} |
|
} // endDocument() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public void endGeneralEntity(String name, Augmentations augs) throws XNIException { |
|
if (fDocumentHandler != null && !fOnlyPassPrefixMappingEvents) { |
|
fDocumentHandler.endGeneralEntity(name, augs); |
|
} |
|
} // endEntity(String) |
|
|
|
// |
|
// Protected methods |
|
// |
|
|
|
|
|
protected void handleStartElement(QName element, XMLAttributes attributes, |
|
Augmentations augs, |
|
boolean isEmpty) throws XNIException { |
|
|
|
|
|
fNamespaceContext.pushContext(); |
|
|
|
if (element.prefix == XMLSymbols.PREFIX_XMLNS) { |
|
fErrorReporter.reportError(XMLMessageFormatter.XMLNS_DOMAIN, |
|
"ElementXMLNSPrefix", |
|
new Object[]{element.rawname}, |
|
XMLErrorReporter.SEVERITY_FATAL_ERROR); |
|
} |
|
|
|
|
|
int length = attributes.getLength(); |
|
for (int i = 0; i < length; i++) { |
|
String localpart = attributes.getLocalName(i); |
|
String prefix = attributes.getPrefix(i); |
|
// when it's of form xmlns="..." or xmlns:prefix="...", |
|
|
|
if (prefix == XMLSymbols.PREFIX_XMLNS || |
|
prefix == XMLSymbols.EMPTY_STRING && localpart == XMLSymbols.PREFIX_XMLNS) { |
|
|
|
|
|
String uri = fSymbolTable.addSymbol(attributes.getValue(i)); |
|
|
|
|
|
if (prefix == XMLSymbols.PREFIX_XMLNS && localpart == XMLSymbols.PREFIX_XMLNS) { |
|
fErrorReporter.reportError(XMLMessageFormatter.XMLNS_DOMAIN, |
|
"CantBindXMLNS", |
|
new Object[]{attributes.getQName(i)}, |
|
XMLErrorReporter.SEVERITY_FATAL_ERROR); |
|
} |
|
|
|
|
|
if (uri == NamespaceContext.XMLNS_URI) { |
|
fErrorReporter.reportError(XMLMessageFormatter.XMLNS_DOMAIN, |
|
"CantBindXMLNS", |
|
new Object[]{attributes.getQName(i)}, |
|
XMLErrorReporter.SEVERITY_FATAL_ERROR); |
|
} |
|
|
|
|
|
if (localpart == XMLSymbols.PREFIX_XML) { |
|
if (uri != NamespaceContext.XML_URI) { |
|
fErrorReporter.reportError(XMLMessageFormatter.XMLNS_DOMAIN, |
|
"CantBindXML", |
|
new Object[]{attributes.getQName(i)}, |
|
XMLErrorReporter.SEVERITY_FATAL_ERROR); |
|
} |
|
} |
|
|
|
else { |
|
if (uri ==NamespaceContext.XML_URI) { |
|
fErrorReporter.reportError(XMLMessageFormatter.XMLNS_DOMAIN, |
|
"CantBindXML", |
|
new Object[]{attributes.getQName(i)}, |
|
XMLErrorReporter.SEVERITY_FATAL_ERROR); |
|
} |
|
} |
|
|
|
prefix = localpart != XMLSymbols.PREFIX_XMLNS ? localpart : XMLSymbols.EMPTY_STRING; |
|
|
|
// http://www.w3.org/TR/1999/REC-xml-names-19990114/#dt-prefix |
|
// We should only report an error if there is a prefix, |
|
// that is, the local part is not "xmlns". -SG |
|
// Since this is an error condition in XML 1.0, |
|
// and should be relatively uncommon in XML 1.1, |
|
// making this test into a method call to reuse code |
|
|
|
if(prefixBoundToNullURI(uri, localpart)) { |
|
fErrorReporter.reportError(XMLMessageFormatter.XMLNS_DOMAIN, |
|
"EmptyPrefixedAttName", |
|
new Object[]{attributes.getQName(i)}, |
|
XMLErrorReporter.SEVERITY_FATAL_ERROR); |
|
continue; |
|
} |
|
|
|
|
|
fNamespaceContext.declarePrefix(prefix, uri.length() != 0 ? uri : null); |
|
|
|
} |
|
} |
|
|
|
|
|
String prefix = element.prefix != null |
|
? element.prefix : XMLSymbols.EMPTY_STRING; |
|
element.uri = fNamespaceContext.getURI(prefix); |
|
if (element.prefix == null && element.uri != null) { |
|
element.prefix = XMLSymbols.EMPTY_STRING; |
|
} |
|
if (element.prefix != null && element.uri == null) { |
|
fErrorReporter.reportError(XMLMessageFormatter.XMLNS_DOMAIN, |
|
"ElementPrefixUnbound", |
|
new Object[]{element.prefix, element.rawname}, |
|
XMLErrorReporter.SEVERITY_FATAL_ERROR); |
|
} |
|
|
|
|
|
for (int i = 0; i < length; i++) { |
|
attributes.getName(i, fAttributeQName); |
|
String aprefix = fAttributeQName.prefix != null |
|
? fAttributeQName.prefix : XMLSymbols.EMPTY_STRING; |
|
String arawname = fAttributeQName.rawname; |
|
if (arawname == XMLSymbols.PREFIX_XMLNS) { |
|
fAttributeQName.uri = fNamespaceContext.getURI(XMLSymbols.PREFIX_XMLNS); |
|
attributes.setName(i, fAttributeQName); |
|
} |
|
else if (aprefix != XMLSymbols.EMPTY_STRING) { |
|
fAttributeQName.uri = fNamespaceContext.getURI(aprefix); |
|
if (fAttributeQName.uri == null) { |
|
fErrorReporter.reportError(XMLMessageFormatter.XMLNS_DOMAIN, |
|
"AttributePrefixUnbound", |
|
new Object[]{element.rawname,arawname,aprefix}, |
|
XMLErrorReporter.SEVERITY_FATAL_ERROR); |
|
} |
|
attributes.setName(i, fAttributeQName); |
|
} |
|
} |
|
|
|
// verify that duplicate attributes don't exist |
|
|
|
int attrCount = attributes.getLength(); |
|
for (int i = 0; i < attrCount - 1; i++) { |
|
String auri = attributes.getURI(i); |
|
if (auri == null || auri == NamespaceContext.XMLNS_URI) { |
|
continue; |
|
} |
|
String alocalpart = attributes.getLocalName(i); |
|
for (int j = i + 1; j < attrCount; j++) { |
|
String blocalpart = attributes.getLocalName(j); |
|
String buri = attributes.getURI(j); |
|
if (alocalpart == blocalpart && auri == buri) { |
|
fErrorReporter.reportError(XMLMessageFormatter.XMLNS_DOMAIN, |
|
"AttributeNSNotUnique", |
|
new Object[]{element.rawname,alocalpart, auri}, |
|
XMLErrorReporter.SEVERITY_FATAL_ERROR); |
|
} |
|
} |
|
} |
|
|
|
|
|
if (fDocumentHandler != null && !fOnlyPassPrefixMappingEvents) { |
|
if (isEmpty) { |
|
fDocumentHandler.emptyElement(element, attributes, augs); |
|
} |
|
else { |
|
fDocumentHandler.startElement(element, attributes, augs); |
|
} |
|
} |
|
|
|
|
|
} // handleStartElement(QName,XMLAttributes,boolean) |
|
|
|
|
|
protected void handleEndElement(QName element, Augmentations augs, boolean isEmpty) |
|
throws XNIException { |
|
|
|
|
|
String eprefix = element.prefix != null ? element.prefix : XMLSymbols.EMPTY_STRING; |
|
element.uri = fNamespaceContext.getURI(eprefix); |
|
if (element.uri != null) { |
|
element.prefix = eprefix; |
|
} |
|
|
|
|
|
if (fDocumentHandler != null && !fOnlyPassPrefixMappingEvents) { |
|
if (!isEmpty) { |
|
fDocumentHandler.endElement(element, augs); |
|
} |
|
} |
|
|
|
|
|
fNamespaceContext.popContext(); |
|
|
|
} // handleEndElement(QName,boolean) |
|
|
|
// returns true iff the given prefix is bound to "" *and* |
|
|
|
protected boolean prefixBoundToNullURI(String uri, String localpart) { |
|
return (uri == XMLSymbols.EMPTY_STRING && localpart != XMLSymbols.PREFIX_XMLNS); |
|
} // prefixBoundToNullURI(String, String): boolean |
|
|
|
} // class XMLNamespaceBinder |