code: protected void addAttributes(SXTag dataNode, String keyPrefix,
  			Collection<XAttribute> attributes) throws IOException {
  		for (XAttribute attribute : attributes) {
  			// skip attributes defined by standard extensions
  			// to ensure parity with MXML input files.
  			if (// BVD: KEEP ALL Attributes
  				// attribute.getKey().equals(XConceptExtension.KEY_NAME)
  				// || attribute.getKey()
  				// .equals(XConceptExtension.KEY_INSTANCE)
  				// || attribute.getKey().equals(XLifecycleExtension.KEY_MODEL)
  				// || attribute.getKey().equals(
  				// XLifecycleExtension.KEY_TRANSITION)
  				// || attribute.getKey().equals(
  				// XOrganizationalExtension.KEY_GROUP)
  				// || attribute.getKey().equals(
  				// XOrganizationalExtension.KEY_RESOURCE)
  				// || attribute.getKey().equals(
  				// XOrganizationalExtension.KEY_ROLE)||
  			attribute.getKey().equals(XSemanticExtension.KEY_MODELREFERENCE)
  			// || attribute.getKey().equals(XTimeExtension.KEY_TIMESTAMP)
  			) {
  				continue;
  			}
  			SXTag attributeTag = dataNode.addChildNode("attribute");
  			attributeTag.addAttribute("name", keyPrefix + attribute.getKey());
  			addModelReference(attribute, attributeTag);
  			attributeTag.addTextNode(attribute.toString());
  			Collection<XAttribute> subAttributes = attribute.getAttributes()
  					.values();
  			if (subAttributes.size() > 0) {
  				String subKeyPrefix = attribute.getKey();
  				if (keyPrefix.length() > 0) {
  					subKeyPrefix = keyPrefix + ":" + subKeyPrefix;
  				}
  				addAttributes(dataNode, subKeyPrefix, subAttributes);
  			}
  		}
  	}
docs: Helper method, adds attributes to a tag.
  
  @param dataNode
  The tag to add attributes to.
  @param keyPrefix
  the Key prefix of attributes.
  @param attributes
  The attributes to add.