code: public Attributes complement(Attributes that)
      {
          Attributes result = new Attributes(this);
          if (that != null)
          {
              for (Tag tagToRemove : that.attributes.keySet())
              {
                  for (Iterator<Tag> tags = result.attributes.keySet().iterator(); tags.hasNext(); )
                  {
                      Tag tag = tags.next();
                      if (tagToRemove.matches(tag)) tags.remove();
                  }
              }
          }
          return result;
      }
docs: Removes the attributes of this <code>Attributes</code> object that are present in the given
  <code>Attributes</code> object, returning a new <code>Attributes</code> object.
  The resulting <code>Attributes</code> will contain only the attributes whose tags are present in this
  <code>Attributes</code> object but not in the given <code>Attributes</code> object.
  If a tag in the given <code>Attributes</code> object contains the globbing character '*', all attributes in this
  <code>Attributes</code> object that match will be removed.
  If the given <code>Attributes</code> is null, a clone of this <code>Attributes</code> object will be returned.
  
  @param that The <code>Attributes</code> to complement with
  @return A new <code>Attributes</code> object containing the complement of the attributes.
  @see #union(Attributes)
  @see #intersect(Attributes)