in src/org/apache/xalan/xsltc/compiler/XslAttribute.java [80:176]
public void parseContents(Parser parser) {
boolean generated = false;
final SymbolTable stable = parser.getSymbolTable();
String name = getAttribute("name");
String namespace = getAttribute("namespace");
QName qname = parser.getQName(name, false);
final String prefix = qname.getPrefix();
if (((prefix != null) && (prefix.equals(XMLNS_PREFIX)))||(name.equals(XMLNS_PREFIX))) {
reportError(this, parser, ErrorMsg.ILLEGAL_ATTR_NAME_ERR, name);
return;
}
_isLiteral = Util.isLiteral(name);
if (_isLiteral) {
if (!XML11Char.isXML11ValidQName(name)) {
reportError(this, parser, ErrorMsg.ILLEGAL_ATTR_NAME_ERR, name);
return;
}
}
// Ignore attribute if preceeded by some other type of element
final SyntaxTreeNode parent = getParent();
final Vector siblings = parent.getContents();
for (int i = 0; i < parent.elementCount(); i++) {
SyntaxTreeNode item = (SyntaxTreeNode)siblings.elementAt(i);
if (item == this) break;
// These three objects result in one or more attribute output
if (item instanceof XslAttribute) continue;
if (item instanceof UseAttributeSets) continue;
if (item instanceof LiteralAttribute) continue;
if (item instanceof Text) continue;
// These objects _can_ result in one or more attribute
// The output handler will generate an error if not (at runtime)
if (item instanceof If) continue;
if (item instanceof Choose) continue;
if (item instanceof CopyOf) continue;
if (item instanceof VariableBase) continue;
// Report warning but do not ignore attribute
reportWarning(this, parser, ErrorMsg.STRAY_ATTRIBUTE_ERR, name);
}
// Get namespace from namespace attribute?
if (namespace != null && namespace != Constants.EMPTYSTRING) {
_prefix = lookupPrefix(namespace);
_namespace = new AttributeValueTemplate(namespace, parser, this);
}
// Get namespace from prefix in name attribute?
else if (prefix != null && prefix != Constants.EMPTYSTRING) {
_prefix = prefix;
namespace = lookupNamespace(prefix);
if (namespace != null) {
_namespace = new AttributeValueTemplate(namespace, parser, this);
}
}
// Common handling for namespaces:
if (_namespace != null) {
// Generate prefix if we have none
if (_prefix == null || _prefix == Constants.EMPTYSTRING) {
if (prefix != null) {
_prefix = prefix;
}
else {
_prefix = stable.generateNamespacePrefix();
generated = true;
}
}
else if (prefix != null && !prefix.equals(_prefix)) {
_prefix = prefix;
}
name = _prefix + ":" + qname.getLocalPart();
/*
* TODO: The namespace URI must be passed to the parent
* element but we don't yet know what the actual URI is
* (as we only know it as an attribute value template).
*/
if ((parent instanceof LiteralElement) && (!generated)) {
((LiteralElement)parent).registerNamespace(_prefix,
namespace,
stable, false);
}
}
if (parent instanceof LiteralElement) {
((LiteralElement)parent).addAttribute(this);
}
_name = AttributeValue.create(this, name, parser);
parseChildren(parser);
}