code: @Override
  	protected Object doExec(Element element, Object scope, String propertyPath, Object... arguments) throws TemplateException {
  		if (!propertyPath.equals(".") && ConverterRegistry.hasType(scope.getClass())) {
  			throw new TemplateException("Operand is property path but scope is not an object.");
  		}
  		Object value = content.getObject(scope, propertyPath);
  		if (value == null) {
  			return null;
  		}
  		if (Types.isNumber(value)) {
  			value = value.toString();
  		}
  		if (Types.isEnum(value)) {
  			value = ((Enum<?>) value).name();
  		}
  		if (!(value instanceof String)) {
  			throw new TemplateException("Invalid element |%s|. ID operand should be string, enumeration or numeric.", element);
  		}
  		return new AttrImpl("id", (String) value);
  	}
docs: Execute ID operator. Uses property path to extract content value, convert it to string and set <em>id</em> attribute.
  
  @param element context element, unused,
  @param scope scope object,
  @param propertyPath property path,
  @param arguments optional arguments, unused.
  @return always returns null for void.
  @throws TemplateException if requested content value is undefined.