【问题标题】:Copy the all <item> attribute from input XML file to output xml file through xquery通过 xquery 将输入 XML 文件中的所有 <item> 属性复制到输出 xml 文件
【发布时间】:2020-01-11 06:58:35
【问题描述】:

第一个 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>

我的预期输出如下所示,这意味着所有 &lt;prod&gt; 元素都在 &lt;item&gt; 下,并带有所有 &lt;item&gt; 属性信息

<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>

MY CODE 如下所示:

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>

请指导一下,谢谢

【问题讨论】:

  • 为什么第二个文件有item,第一个已经有prod信息?在您预期的输出中,您似乎只是复制了那个特定的 item 元素。其他元素应该怎么做?
  • 您可以使用函数functx:copy-attributes。请注意,您必须复制函数的代码 - 它不是命名空间 functx 的内部函数,
  • @Ansari - 很难遵循这里的逻辑。如果要复制“项目属性”,则需要有这样的项目。而且我看不出您想如何选择这样的项目。拥有它后,我们可以向您展示如何复制其属性。

标签: xml xpath xquery marklogic


【解决方案1】:

试试下面的方法:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多