1

非常に複雑な XQuery を作成する必要があります (少なくとも私の基準では)。

ここに私の入力xmlがあります:

<testRequest>
    <request1>
       <Line>1</Line>
       <action>addtoName</action>
    </request1>
    <request2>
        <Line>2</Line>
        <action>addtoSpace</action>
    </request2>
    <request3>
         <Line>3<Line>
         <action>addtospace</action>
    </request3>
</testRequest>

私の出力 xml では、アクションは "request1" 要素に属性として添付する必要があります。したがって、request1 要素の下の action 要素に基づいて、request1 要素の属性は次のいずれかになります。

if action = IgnoreCase(addtoName), the request1 element should be <request1 action=insertingname>
if action =  IgnoreCase(addtoSpace), the request1 element should be <request1 action=updatingspace>

これだけでなく、その下にあるアクション値に基づいて、要素に属性を追加する必要もあります。したがって、要素の下の各要素をトラバースし、要素のいずれかが「addtospace」と等しいかどうかを確認する必要があります。そうであれば、要素の対応する値を取得し、要素の属性を構成する必要があります。上記の xml から、要素の属性は次のようになります。

<testRequest lineFiller="Line Like 2_* AND Line Like 3_*>, where 2 and 3 are the respective line numbers.

element= addtoSpace を持つ要素がない場合は、要素の属性を「変更」する必要があります。

したがって、要約すると、変換された xml は次のようになります。

<testRequest lineFiller="Line Like 2_* AND Line Like 3_*>
    <request1 action=insertingname>
       <Line>1</Line>
       <action>addtoName</action>
    </request1>
    <request2 action=updatingspace>
        <Line>2</Line>
        <action>addtoSpace</action>
    </request2>
    <request3 action=updatingspace>
         <Line>3<Line>
         <action>addtospace</action>
    </request3>
</testRequest>

この膨大なタスクを達成するための助けをいただければ幸いです。

ありがとう!!!

4

1 に答える 1

1

要素に追加する必要がある属性を生成する関数を定義する必要があります。

「リクエスト」要素に追加するには、これが機能するはずです:

declare function local:getaction($x) {
  if (lower-case($x/action) = "addtoname") then attribute action {"insertingspace"} else
  if (lower-case($x/action) = "addtospace") then attribute action {"updatingspace"} else
  ()
};

linefiller 属性も同様に作成できます。

declare function local:getfiller($x) {
  attribute lineFiller {
      if ($x/*[lower-case(action) = "addtospace"]) then
          string-join(
          for $r in $x/*[lower-case(action) = "addtospace"]
            return concat("Line Like ",$r/Line,"_*")
          , " AND ")
      else "change"
      }
};

次に、すべてをまとめるために、元のドキュメントに対して単純な for ループを実行し、必要に応じて属性を追加します。

let $doc:=<<your original document>>

return
<testRequest>
{ local:getfiller($doc) }
{ for $r in $doc/* return 
   element { name($r) } { 
    local:getaction($r),
    $r/* 
   }
}
</testRequest>

編集: アクションがない場合に「変更」を返すように getfiller 関数を強化

于 2013-03-21T16:38:36.913 に答える