0

我是 Xquery 的新手,我想将给定的 xml 更改为另一种 xml 格式。

给定 XML:

<?xml version="1.0" encoding="UTF-8"?>
<Store>
<consumer id="H01">
<name>John Doe</name>
<items>
<item type = "Torch">
<price>$3</price>
</item>
<item type = "Gas">
<price>$4</price>
</item>
</items>
</consumer >
<consumer id="H05">
<name>Jane Doe</name>
<items>
<item type = "Cell">
<price>$8</price>
</item>
<item type = "Shirt">
<price>$12</price>
</item>
</items>
</consumer>

所需的 XML 格式:

<Store>
<user>
<number><id>H01</id><name>John Doe</name></number>
<number><id>H05</id><name>Jane Doe</name></number>
</user>
<inventory>
<number><type>Torch</type><price>$3</price></number>
<number><type>Gas</type><price>$4</price></number>
<number><type>Cell</type><price>$8</price></number>
<number><type>Shirt</type><price>$12</price></number>
</inventory>
</Store>

我制作的 Xquery:

for $customer in distinct-values(doc("../xml/store.xml")/store/consumer/@id)
let $name := doc("../xml/store.xml")/store/consumer[@id=$customer]/name
for $object in distinct-  values(doc("../xml/store.xml")/store/consumer[@id=$customer]/items/item/@type)
return 
<store>
<user>
<number>
<id>{$customer}</id>
{$name}
</number>
</user>
<inventory>
<number>
<type>{$object}</type>
</number>
</inventory>
</store>

我到底哪里错了?有没有办法我们可以将属性作为新的节点元素。

4

1 回答 1

0

你的两个 for 子句是嵌套的,在这种情况下你不希望这样。我会做这样的事情:

let $doc := doc("../xml/store.xml")
let $customerIds := distinct-values($doc/store/consumer/@id)

return
<store>
<user>{for $customerId in $customerIds
let $consumer := $doc/store/consumer[@id=$customerId]
return <number><id>{data($consumer/@id)}</id><name>{$consumer/name}</name></number>
}
</user>
<inventory>
similar thing for items
</inventory>
</store>

有没有办法我们可以将属性作为新的节点元素。

是的,例如,您可以使用 data() 函数来提取文本。请参见上面的示例。

于 2013-10-29T14:47:37.580 回答