{
int nameCode = evaluateNameCode(context);
if (nameCode == -1) {
return null;
}
SequenceReceiver out = context.getReceiver();
int opt = getOptions();
int ann = getAnnotation();
// we may need to change the namespace prefix if the one we chose is
// already in use with a different namespace URI: this is done behind the scenes
// by the ComplexContentOutputter
CharSequence value = expandChildren(context).toString();
SimpleType schemaType = getSchemaType();
int validationAction = getValidationAction();
if (schemaType != null) {
// test whether the value actually conforms to the given type
try {
ValidationFailure err = schemaType.validateContent(
value, DummyNamespaceResolver.getInstance(), context.getConfiguration().getNameChecker());
if (err != null) {
ValidationException ve = new ValidationException(
"Attribute value " + Err.wrap(value, Err.VALUE) +
" does not match the required type " +
schemaType.getDescription() + ". " +
err.getMessage());
ve.setErrorCode("XTTE1540");
throw ve;
}
} catch (UnresolvedReferenceException ure) {
throw new ValidationException(ure);
}
} else if (validationAction==Validation.STRICT ||
validationAction==Validation.LAX) {
try {
ann = context.getConfiguration().validateAttribute(nameCode, value, validationAction);
} catch (ValidationException e) {
XPathException err = XPathException.makeXPathException(e);
String errorCode = e.getErrorCodeLocalPart();
if (errorCode == null) {
errorCode = (validationAction==Validation.STRICT ? "XTTE1510" : "XTTE1515");
}
err.setErrorCode(errorCode);
err.setXPathContext(context);
err.setLocator(this);
err.setIsTypeError(true);
throw err;
}
}
if ((nameCode & NamePool.FP_MASK) == StandardNames.XML_ID) {
value = Whitespace.collapseWhitespace(value);
}
try {
out.attribute(nameCode, ann, value, locationId, opt);
} catch (XPathException err) {
throw dynamicError(this, err, context);
}
return null;