Você pode conseguir o que quiser com a ajuda de um pequeno script Python (você precisará do Python instalado, bem como do lxml
kit de ferramentas).
tagsort.py
:
#!/usr/bin/python
import sys
from lxml import etree
filename, tag = sys.argv[1:]
doc = etree.parse(filename, etree.XMLParser(remove_blank_text=True))
root = doc.getroot()
root[:] = sorted(root, key=lambda el: el.findtext(tag))
print etree.tostring(doc, pretty_print=True)
Esse script classifica os elementos de primeiro nível na raiz do documento XML pelo conteúdo de um elemento de segundo nível, enviando o resultado para stdout. É chamado assim:
$ python tagsort.py filename tag
Depois de conseguir isso, você pode usar a substituição de processos para obter uma comparação com base na saída (adicionei um elemento e alterei outro em seus arquivos de exemplo para mostrar um resultado não vazio):
$ diff <(python tagsort.py file1 Id) <(python tagsort.py file2 Id)
4a5
> <AddedTag>Something</AddedTag>
17c18
< <Role>X</Role>
---
> <Role>S</Role>