private void parseAttributes(ArrayList<XmlAttr> attrList)
	{
		// Sort attributes by key name
		Collections.sort(attrList, new Comparator<XmlAttr>() {
			public int compare(XmlAttr o1, XmlAttr o2) {
				return o1.key.compareTo(o2.key);
			}
		});
		
		boolean added;
		boolean ignore;
		// Read and create uniques combinations
		for (int i = 0; i < attrList.size(); ++i)
		{
			ignore = false;
			XmlAttr attr = attrList.get(i);
			for (int j = 0; j < TAG_IGNORE.length; ++j)
				if (attr.key.equals(TAG_IGNORE[j]))
					ignore = true;
			// Don't parse ignored tags.
			if (!ignore)
			{
				added = false;
				for (int j = 0; j < baseItemList.size(); ++j)
				{
					// Find if combination exist
					if (attr.equals(baseItemList.get(j).key, baseItemList.get(j).value))
					{
						++baseItemList.get(j).count;
						baseItemList.get(j).addFiles(currentFile);
						attr.id = baseItemList.get(j).id;
						added = true;
					}
				}
				// If not found, add this combination
				if (!added)
				{
					attr.addFiles(currentFile);
					baseItemList.add(attr);
				}
			}
		}
		
		// Creates all tuples (n > 1)
		for (int i = 1; i < attrList.size(); ++i)
			createTuple(attrList, new ArrayList<XmlAttr>(), 0, i + 1);
	}