AttributePSVImpl attrPSVI = null;
boolean isSimple =
fCurrentType == null || fCurrentType.getTypeCategory() == XSTypeDefinition.SIMPLE_TYPE;
XSObjectList attrUses = null;
int useCount = 0;
XSWildcardDecl attrWildcard = null;
if (!isSimple) {
attrUses = attrGrp.getAttributeUses();
useCount = attrUses.getLength();
attrWildcard = attrGrp.fAttributeWC;
}
// Element Locally Valid (Complex Type)
// 3 For each attribute information item in the element information item's [attributes] excepting those whose [namespace name] is identical to http://www.w3.org/2001/XMLSchema-instance and whose [local name] is one of type, nil, schemaLocation or noNamespaceSchemaLocation, the appropriate case among the following must be true:
// get the corresponding attribute decl
for (int index = 0; index < attCount; index++) {
attributes.getName(index, fTempQName);
if (DEBUG) {
System.out.println("==>process attribute: " + fTempQName);
}
if (fAugPSVI || fIdConstraint) {
augs = attributes.getAugmentations(index);
attrPSVI = (AttributePSVImpl) augs.getItem(Constants.ATTRIBUTE_PSVI);
if (attrPSVI != null) {
attrPSVI.reset();
} else {
attrPSVI = new AttributePSVImpl();
augs.putItem(Constants.ATTRIBUTE_PSVI, attrPSVI);
}
// PSVI attribute: validation context
attrPSVI.fValidationContext = fValidationRoot;
}
// Element Locally Valid (Type)
// 3.1.1 The element information item's [attributes] must be empty, excepting those
// whose [namespace name] is identical to http://www.w3.org/2001/XMLSchema-instance and
// whose [local name] is one of type, nil, schemaLocation or noNamespaceSchemaLocation.
// for the 4 xsi attributes, get appropriate decl, and validate
if (fTempQName.uri == SchemaSymbols.URI_XSI) {
XSAttributeDecl attrDecl = null;
if (fTempQName.localpart == SchemaSymbols.XSI_TYPE) {
attrDecl = XSI_TYPE;
}
else if (fTempQName.localpart == SchemaSymbols.XSI_NIL) {
attrDecl = XSI_NIL;
}
else if (fTempQName.localpart == SchemaSymbols.XSI_SCHEMALOCATION) {
attrDecl = XSI_SCHEMALOCATION;
}
else if (fTempQName.localpart == SchemaSymbols.XSI_NONAMESPACESCHEMALOCATION) {
attrDecl = XSI_NONAMESPACESCHEMALOCATION;
}
if (attrDecl != null) {
processOneAttribute(element, attributes, index, attrDecl, null, attrPSVI);
continue;
}
}
// for namespace attributes, no_validation/unknow_validity
if (fTempQName.rawname == XMLSymbols.PREFIX_XMLNS
|| fTempQName.rawname.startsWith("xmlns:")) {
continue;
}
// simple type doesn't allow any other attributes
if (isSimple) {
reportSchemaError(
"cvc-type.3.1.1",
new Object[] { element.rawname, fTempQName.rawname });
continue;
}
// it's not xmlns, and not xsi, then we need to find a decl for it
XSAttributeUseImpl currUse = null, oneUse;
for (int i = 0; i < useCount; i++) {
oneUse = (XSAttributeUseImpl) attrUses.item(i);
if (oneUse.fAttrDecl.fName == fTempQName.localpart
&& oneUse.fAttrDecl.fTargetNamespace == fTempQName.uri) {
currUse = oneUse;
break;
}