Скопируйте атрибут all <item>из входного файла XML в выходной файл xml через xquery - PullRequest
0 голосов
/ 11 января 2020

Первый xml файл с информацией о ценах:

<prices>
    <priceList effDate="2006-11-15">
        <prod num="557">
            <price currency="USD">29.99</price>
            <discount type="CLR">10.00</discount>
        </prod>
        <prod num="563">
            <price currency="USD">69.99</price>
        </prod>
        <prod num="443">
            <price currency="USD">39.99</price>
            <discount type="CLR">3.99</discount>
        </prod>
    </priceList>
</prices>

Второй XML Файл с информацией о заказе

<order num="00299432" date="2006-09-15" cust="0221A">
    <item dept="WMN" num="557" quantity="1" color="navy">
        <prod num="557">
            <price currency="USD">29.99</price>
            <discount type="CLR">10.00</discount>
        </prod>
    </item>
    <item dept="ACC" num="563" quantity="1"/>
    <item dept="ACC" num="443" quantity="2"/>
    <item dept="MEN" num="784" quantity="1" color="white"/>
    <item dept="MEN" num="784" quantity="1" color="gray"/>
    <item dept="WMN" num="557" quantity="1" color="black"/>
</order>

Мой ожидаемый результат ниже, например, означает, что все элементы <prod> попадают под <item> со всеми <item> атрибутами

<item dept="WMN" num="557" quantity="1" color="navy">
<prod num="557">
<price currency="USD">29.99</price>
<discount type="CLR">10.00</discount>
</prod>
</item>

МОЙ КОД ниже как что:

let $prices := fn:doc('/training/prices.xml')/prices
let $order := fn:doc('/training/order.xml')/order
where $prices/priceList/prod[@num=$order/item/@num]
for $kk in $prices/priceList/prod[@num=$order/item/@num]
return 
<item>
{$kk}
</item>

вывод:

<item>
<prod num="557">
<price currency="USD">29.99</price>
<discount type="CLR">10.00</discount>
</prod>
</item>

пожалуйста, направьте меня, спасибо

1 Ответ

2 голосов
/ 15 января 2020

Попробуйте что-то вроде ниже:

declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";

declare option output:indent 'yes';

let $prices := fn:doc('Price.xml')/prices
let $order := fn:doc('Order.xml')/order where $prices/priceList/prod[@num=$order/item/@num]
return
for $kk in $prices/priceList/prod[@num=$order/item/@num]

return 
<item>{
    $order/item[@num=$kk/@num][1]/@*,
    $kk
}</item>

Ссылка: https://xqueryfiddle.liberty-development.net/bdxZ8L

...