/**
* Expands an element type or attribute name (according to the
* value of the <code>isAttribute</code> argument) using the
* namespace declarations in effect for the specified element.
* For a non-global attribute or for an unqualified element type
* name or for a name starting with "xml:", returns the name
* unchanged. Otherwise returns an expanded name consisting
* of the namespace URI followed by a <code>+</code>
* character followed by the local part. Returns null if the name
* cannot be expanded because a namespace prefix is not declared.
*/
String expandName(String name, Element element, boolean isAttribute) {
// The index of the colon character in the name.
int colonIndex = name.indexOf(':');
// The name of the attribute that declares the namespace prefix.
String declAttName;
if (colonIndex == -1) {
// Default namespace applies only to element type names.
if (isAttribute)
return name;
declAttName = "xmlns";
}
else {
String prefix = name.substring(0, colonIndex);
// "xml:" is special
if (prefix.equals("xml"))
return name;
declAttName = "xmlns:" + prefix;
}
for (; element != null; element = element.getParent()) {
String ns = element.getAttributeValue(declAttName);
if (ns != null) {
// Handle special meaning of xmlns=""
if (ns.length() == 0 && colonIndex == -1)
return name;
return ns + '+' + name.substring(colonIndex + 1);
}
}
return null;
}
James