![](/img/trans.png)
[英]XQuery - Swap attribute and element values (inverse structure) dynamically
[英]Modifying all element attribute values with Xquery
如何使用Xquery以XML示例中表示的方式修改所有想要的屬性值?
我正在使用Basex 7.6 Xquery和XML數據庫引擎。 到目前為止,我的目的只是使用XML處理XML文件。
我已經有了該結構:
<address ref="file1" title="title1">
<address ref="file1.1" title="title1.1">
<address ref="file1.1.1" title="title1.1.1"/>
</address>
<address ref="file1.2" title="title1.2">
<address ref="file1.2.1" title="title1.2.1"/>
<address ref="file1.2.2" title="title1.2.2">
<address ref="file1.2.2.1" title="title1.2.2.1"/>
<address ref="file1.2.2.2" title="title1.2.2.2"/>
</address>
</address>
</address>
<address ref="file2" title="title2"/>
但是我需要像下面這樣:
<address ref="mydir/file1" title="title1">
<address ref="mydir/file1.1" title="title1.1">
<address ref="mydir/file1.1.1" title="title1.1.1"/>
</address>
<address ref="mydir/file1.2" title="title1.2">
<address ref="mydir/file1.2.1" title="title1.2.1"/>
<address ref="mydir/file1.2.2" title="title1.2.2">
<address ref="mydir/file1.2.2.1" title="title1.2.2.1"/>
<address ref="mydir/file1.2.2.2" title="title1.2.2.2"/>
</address>
</address>
</address>
<address ref="mydir/file2" title="title2"/>
我已經設法按照自己想要的方式更改了第一個元素,但是仍然無法以Xquery引擎接受的方式正確地進行操作。
我已經用BaseX 7.6中的這段代碼更改了第一個元素,但是我還沒有弄清楚如何將其應用於所有元素。
copy $c :=
(<address ref="file1" title="title1">
<address ref="file1.1" title="title1.1">
<address ref="file1.1.1" title="title1.1.1"/>
</address>
<address ref="file1.2" title="title1.2">
<address ref="file1.2.1" title="title1.2.1"/>
<address ref="file1.2.2" title="title1.2.2">
<address ref="file1.2.2.1" title="title1.2.2.1"/>
<address ref="file1.2.2.2" title="title1.2.2.2"/>
</address>
</address>
</address>
(:<address ref="file2" title="title2"/> WHY IS THIS NOT BY THE WAY ACCEPTED?:)
)
modify (
replace value of node $c/@ref with concat('mydir/', $c/@ref)
)
return $c
有關我嘗試解決此問題的方式的信息,可以在以下位置找到: http : //docs.basex.org/wiki/XQuery_Update#Non-Updating_Expressions
我覺得BaseX是執行此操作的好工具。 我只是不知道該怎么做。 我認為在這種情況下,遞歸也可以解決。 由於我的經驗不足,我仍然無法弄清楚。
提前致謝!
這會將mydir/
放在XML數據中的每個ref屬性之前
copy $c := (<root>
<address ref="file1" title="title1">
<address ref="file1.1" title="title1.1">
<address ref="file1.1.1" title="title1.1.1"/>
</address>
<address ref="file1.2" title="title1.2">
<address ref="file1.2.1" title="title1.2.1"/>
<address ref="file1.2.2" title="title1.2.2">
<address ref="file1.2.2.1" title="title1.2.2.1"/>
<address ref="file1.2.2.2" title="title1.2.2.2"/>
</address>
</address>
</address>
<address ref="file2" title="title2"/>
</root>)
modify (
for $e in $c//@ref
return replace value of node $e with concat('mydir/', $e)
)
return $c
第二個address
節點不起作用,因為在XML中,您必須只有一個根節點。 如果願意,可以使用一個序列 ,即(<address />, <address2 />)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.