0

こんにちは私はxqueryとxqueryでのレギュラー式の使用の初心者です。特定のビットを見つけたいxmlタグがあります。somethingjpgですが、.jpgを検索する必要はありません。問題は、somethingjpgが常に同じスペースにあるとは限らないことです。

xmlの例を次に示します。

  <book title="Harry Potter">
    <description
   xlink:type="simple"
   xlink:href="http://book.com/2012/12/28/20121228-there_is_somethingjpg_123456789a1s23e4.jpg"
  xlink:show="new">
 As his fifth year at Hogwarts School of Witchcraft and
  Wizardry approaches, 15-year-old Harry Potter is.......
    </description>
   </book>

または、xlink:hrefは次のようになります。

  <book title="Harry Potter">
    <description
   xlink:type="simple"
   xlink:href="http://book.com/2012/12/28/20121228-there_is_always_more_to_somethingelsejpg_123456789a1s23e4.jpg"
  xlink:show="new">
 As his fifth year at Hogwarts School of Witchcraft and
  Wizardry approaches, 15-year-old Harry Potter is.......
    </description>
   </book>

私が達成しようとしているのは(可能であれば)、そのsomethingjpgまたはsomethingelsejpgを検索するxqueryコードの一部です。次に、somethingjpgまたはsomethingelsejpgを修正して、何かまたは何かを言うだけにし、リンクを再度連結して、eXist-dbの古いリンクに新しいリンクを置き換えます。

コード的には私が持っています。

let $a := collection('/db/articles/')//book
for $b in $a//@xlink:href[contains(.,'jpg_')]
let $c := tokenize(replace($b, 'Some sort of redex I can't figure out', '$1;$2;$3'), ';')
let $d := $c[2]
let $e := replace(substring-before($d, 'jpg_'). '_')
let $f := concat ($c[1]. $e, $c[3])
return update replace $b with $f

残りがわからない…助けて!

4

1 に答える 1

1

おそらく、eXistの XQuery Update 機能を使用したいと思うでしょう。

特に、update replace expr with exprSingleドキュメンテーションは、

[expr] が属性またはテキスト ノードの場合、属性またはテキスト ノードの値は、exprSingle 内のすべてのノードの連結された文字列値に設定されます。

したがって、値に「jpg_」文字列が含まれる属性ノードを見つけて、「jpg_」を空の文字列に置き換えるだけです (正規表現は必要ありません)。replace($attr, 'jpg_', '')

for $attr in $a//@xlink:href[contains(.,'jpg_')]
  let $newval = replace ($attr, 'jpg_', '')
    return update replace $attr with $newval

また、XQuery Update 機能のドキュメントも参照してください(もちろん、eXist は十分にサポートしているように見えますが、完全には実装されていない可能性があります)。

正確に何を置き換えたいのか、なぜトークン化しようとしたのかは完全には明らかではありません。属性値から単に「jpg_」を削除したくない場合は、詳細を追加する必要があります。

于 2013-01-13T13:11:16.213 に答える