@Override
  public void writeXsiTypeAttribute(
      Descriptor descriptor,
      String typeUri,
      String typeLocal,
      String typePrefix,
      boolean addToNamespaceResolver) {
    if (typeLocal == null) {
      return;
    }
    String typeValue = typeLocal;
    if (isNamespaceAware()
        && typeUri != null
        && !typeUri.equals(Constants.EMPTY_STRING)
        && !typeUri.equals(namespaceResolver.getDefaultNamespaceURI())) {
      String prefix = namespaceResolver.resolveNamespaceURI(typeUri);
      if (prefix != null && !prefix.equals(Constants.EMPTY_STRING)) {
        typeValue = prefix + getNamespaceSeparator() + typeValue;
      } else if (typeUri.equals(javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI)) {
        prefix = namespaceResolver.generatePrefix(Constants.SCHEMA_PREFIX);
        typeValue = prefix + getNamespaceSeparator() + typeValue;
        namespaceDeclaration(prefix, typeUri);

      } else if (typePrefix != null && !typePrefix.equals(Constants.EMPTY_STRING)) {
        String existingUri = namespaceResolver.resolveNamespacePrefix(typePrefix);
        if (existingUri != null) {
          prefix = namespaceResolver.generatePrefix();
        } else {
          prefix = typePrefix;
        }
        typeValue = prefix + getNamespaceSeparator() + typeValue;
        namespaceDeclaration(prefix, typeUri);
      } else {
        prefix = namespaceResolver.generatePrefix();
        typeValue = prefix + getNamespaceSeparator() + typeValue;
        namespaceDeclaration(prefix, typeUri);
      }
    }

    String xsiPrefix = null;
    if (isNamespaceAware()) {
      xsiPrefix =
          namespaceResolver.resolveNamespaceURI(
              javax.xml.XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI);
      if (xsiPrefix == null) {
        xsiPrefix = namespaceResolver.generatePrefix(Constants.SCHEMA_INSTANCE_PREFIX);
        namespaceDeclaration(xsiPrefix, javax.xml.XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI);
        if (addToNamespaceResolver) {
          namespaceResolver.put(xsiPrefix, javax.xml.XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI);
        }
      }
    }
    attributeWithoutQName(
        javax.xml.XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI,
        Constants.SCHEMA_TYPE_ATTRIBUTE,
        xsiPrefix,
        typeValue);
  }
  @Override
  public void removeExtraNamespacesFromNamespaceResolver(
      List<Namespace> extraNamespaces, CoreAbstractSession session) {
    if (extraNamespaces == null) {
      return;
    }

    for (int i = 0; i < extraNamespaces.size(); i++) {
      Namespace nextExtraNamespace = (Namespace) extraNamespaces.get(i);
      String uri = namespaceResolver.resolveNamespacePrefix(nextExtraNamespace.getPrefix());
      if ((uri != null) && uri.equals(nextExtraNamespace.getNamespaceURI())) {
        namespaceResolver.removeNamespace(nextExtraNamespace.getPrefix());
      }
    }
  }