簡體   English   中英

使用Xquery修改所有元素屬性值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM