Ik begrijp dat deze vraag al een paar jaar oud is, maar ik kwam hier met een soortgelijk probleem en ik geloof dat ik een antwoord heb gevonden.
with x as (select
'<catalog catalog-id="manufacturer-catalog-id">
<category-assignment category-id="category1" product-id="product1"/>
<category-assignment category-id="category1" product-id="product2"/>
<category-assignment category-id="category2" product-id="product3"/>
</catalog>'::xml as t
)
(
select
xpath('/catalog/@catalog-id', cat_node) catalog_id,
xpath('/category-assignment/@category-id', cat_assn_list) category_id,
xpath('/category-assignment/@product-id', cat_assn_list) product_id
from (select unnest(xpath('/catalog/category-assignment', t)) cat_assn_list, t cat_node from x) q
);
Dit geeft
catalog_id | category_id | product_id
---------------------------+-------------+------------
{manufacturer-catalog-id} | {category1} | {product1}
{manufacturer-catalog-id} | {category1} | {product2}
{manufacturer-catalog-id} | {category2} | {product3}
(3 rows)
Dit voert in feite de basisselectie uit die twee kolommen retourneert 1) de an xpath om een toewijzingslijst te krijgen (meerdere rijen) en 2) het oorspronkelijke categorieknooppunt. De geretourneerde rijen worden vervolgens bewerkt door de xpath-instructies van een hoger niveau - de categorie-id van de volledige categorieknooppuntkolom en de xpaths op kolomniveau in het toewijzingslijstitem.
Ik geloof dat het probleem van de OP was dat het puur uit de kolom met enkele toewijzingslijst rijden betekent dat, aangezien postgres xml-nodesets op het juiste niveau retourneert, in plaats van verwijzingen naar een enkele dom, de xml-uitvoer die hierdoor wordt geretourneerd onder het catalogusniveau ligt en dat xml ndoset niet naar boven kan worden gepasseerd, b.v. met "voorouder::".
Ik hoop dat dit iemand anders helpt.
Bewerken - ik kan geen commentaar geven op de prestaties hiervan, omdat ik geloof dat de catalogus-id xpath zal worden herhaald voor elke toewijzingsrij binnen hetzelfde catalogusknooppunt.