2016-03-26 8 views
1

XQuery 3.0を実装しているBaseXを使用しています。XQueryでのXMLデータソースの埋め込み

XQueryにXMLデータソースを埋め込むには、含める要素をすべて入力する必要はありません。私はこのように、各レベルですべての値の合計を追加したい

<X> 
    <name>The root</name> 
    <Y> 
    <name> Level 1</name> 
    <Z> 
     <name>Level 2a</name> 
     <value>1</value> 
    </Z> 
    </Y> 
    <Y> 
    <name>Level 1b</name> 
    <Z> 
     <name>Level 2b</name> 
     <value>2</value> 
    </Z> 
    </Y> 
</X> 

<X> 
    <name>The root</name> 
    <value>3</value> 
    <Y> 
    <name> Level 1</name> 
    <value>1</value> 
    <Z> 
     <name>Level 2a</name> 
     <value>1</value> 
    </Z> 
    </Y> 
    <Y> 
    <name>Level 1b</name> 
    <value>2</value> 
    <Z> 
     <name>Level 2b</name> 
     <value>2</value> 
    </Z> 
    </Y> 
</X> 

が、私はこのために、このようにXQueryを使用することができます。

たとえば、次のXMLを考えます
for $x in /X 
return 
<X>{ 
    $x/name, 
    <value>{sum($x//value)}</value>, 
    for $y in $x/Y 
    return 
    <Y>{ 
    $y/name, 
    <value>{sum($y//value)}</value>, 
    $y/Z 
    }</Y> 
}</X> 

しかし、これは私が繰り返さなければならない要素がたくさんあるときに非常に面倒です。結果セットに保存したいすべての属性と要素を入力しなくても、この結果を得る方法はありますか?

答えて

2

もちろん可能です! XQueryは非常に強力です。さらに、BaseXはXQuery 3.0だけでなく、XQuery Updateもサポートしています。

XQuery自体は単なるクエリ言語です。したがって、特定の場所に要素を挿入する場合は、例のように要素全体を再作成する必要があります。しかし、XQuery Updateはドキュメントを実際に更新するための構造を追加しています。これを使用してデータベースの値を更新することができます。値をローカルに変換する場合は、transform expressionがあります。

この仕様の構造は非常に大きいので、XML文書を変換するために使用できるBaseX固有キーワードupdateを導入しました。

だから、このクエリを使用すると、次のようになります。もちろん

./X update (
    insert node <value>{sum(.//value)}</value> after ./name, 
    for $y in ./Y 
    return insert node <value>{sum($y//value)}</value> after $y/name 
) 

、あなたの要素を繰り返しているかに応じて、(これはあなたの質問から非常に明確である)、あなたが今、例えばこれを使用することができますそのようなノードを適切な場所に再帰的に挿入します。これを行うためのもう1つのヒント:要素を動的に選択したい場合は、/Xの代わりに/*[local-name() = 'X']を書く必要があるため、要素名は静的である必要はありません。

+2

私はこのxqueryのことを好きになり始めています:) – wvdz

+0

{sum($ something // value)}」と書き直して再帰的に使うことを再帰的に追加することを意味しますか?それがあなたが意味するものなら、このサンプルデータのためにそれを行う方法の例を追加できますか?私の状況では、いくつかのレベルで約15値の集計を追加する必要があります。集計コードを一度書くだけで済むようにすればいいでしょう。 – wvdz