0

Xquery を使用した XML の例で表現されている方法で、必要なすべての属性値を変更するにはどうすればよいですか?

Basex 7.6 Xquery および 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 はこれを行うための優れたツールだと感じています。私はそれを行う方法を理解できません。この場合、どういうわけか再帰も答えだと思います。まだ経験が浅いのでわかりません。

前もって感謝します!

4

1 に答える 1

0

これは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

XML ではルート ノードが 1 つだけ必要なため、 2 番目のaddressノードは機能しません。必要に応じて、シーケンスを使用できます。つまり(<address />, <address2 />)

于 2013-05-31T14:13:22.190 に答える