code: protected final void decodeAttributeXsiNilStructure() throws EXIException,
  			IOException {
  		attributeQNameContext = getXsiNilContext();
  		// handle AT prefix
  		handleAttributePrefix(attributeQNameContext);
  
  		if (preserveLexicalValues) {
  			// as String
  			attributeValue = typeDecoder.readValue(booleanDatatype,
  					getXsiNilContext(), channel, stringDecoder);
  		} else {
  			// as Boolean
  			attributeValue = channel.decodeBooleanValue();
  			// attributeValue = booleanDatatype.readValue(null, channel,
  			// stringDecoder);
  		}
  
  		boolean xsiNil = false;
  
  		if (attributeValue instanceof BooleanValue) {
  			BooleanValue bv = (BooleanValue) attributeValue;
  			xsiNil = bv.toBoolean();
  		} else {
  			// parse string value again (lexical value mode)
  			if (attributeValue instanceof BooleanValue) {
  				xsiNil = ((BooleanValue) attributeValue).toBoolean();
  			} else {
  				BooleanValue bv = BooleanValue.parse(attributeValue.toString());
  				if (bv != null) {
  					xsiNil = bv.toBoolean();
  				}
  			}
  			// booleanDatatype.isValid(attributeValue);
  			// xsiNil = booleanDatatype.getBoolean();
  		}
  
  		final Grammar currentGrammar = getCurrentGrammar();
  		if (xsiNil && currentGrammar.isSchemaInformed()) {
  			// jump to typeEmpty
  			updateCurrentRule(((SchemaInformedFirstStartTagGrammar) currentGrammar)
  					.getTypeEmpty());
  		}
  	}
docs: /*
  Handles and xsi:nil attributes