Tente isto:
SELECT (xpath('./@name', parrot.node))[1] AS name
, unnest(xpath('./descriptor/text()', parrot.node)) AS descriptor
FROM (
SELECT unnest(xpath('./parrot', parrot_xml.document)) AS node
FROM parrot_xml
) parrot;
Produz exatamente a saída solicitada.
Primeiro, na subconsulta, recupero nós de papagaio inteiros. Um nó por linha.
Em seguida, recebo o nome e os descritores com xpath(). Ambos são matrizes. Eu pego o primeiro (e único) elemento de
name
e divida o descriptor
array com `unnest(), chegando assim ao resultado desejado. Escrevi uma resposta abrangente para uma pergunta relacionada recentemente. Pode ser do seu interesse.