2017-06-07 12 views
0

ソースxmlを変換し、複数のフィールドをコンマ区切りのテキストで1つのターゲット文字列要素に結合したいと考えています。複数のxml要素を連結した1つのターゲット要素に変換するXQuery

条件ソース入力(5 Engg1)それは、例えば、ターゲットリストに

を含める必要がある唯一の真の値があれば、boolean型ですXML

のXQuery 1.0に

を同じ達成するために探し

<Root-Element> 
<EnggFN>ABC<EnggFN> 
<EnggLN>XYZ<EnggLN> 
<EnggEML>[email protected]</EnggEML> 
<RoleTypes>Role1,Role2,Role5</RoleTypes> 
</Root-Element> 

を変革期待

<Root-Element> 
<EnggTypes> 
<EnggFN>ABC<EnggFN> 
<EnggLN>XYZ<EnggLN> 
<EnggEML>[email protected]</EnggEML> 
<Engg1>true</Engg1> 
<Engg2>true</Engg2> 
<Engg3>false</Engg3> 
<Engg4>false</Engg4> 
<Engg5>true</Engg5> 
</EnggTypes> 
</Root-Element> 

私はoverthinking開始し、その後、それ以外の場合に場合、私はいくつかの操作を行うことができるかどうかを確認するために、ローカル変数を使用しようとしました以前の値を使用して文字列を構築し、連結しますが、一度設定した変数値を変更することはできません。

{ if (Engg1/text()="true") 
         then (let $roleType:='Role1' return roleType) 
        else if (Engg2/text()="true") 
         then (let $roleType:=fn:concat($roleType,",","Role2") return roleType) 
        else if (Engg3/text()="true") 
         then (let $roleType:=fn:concat($roleType,",","Role3") return roleType) 
        else if (Engg4/text()="true") 
         then (let $roleType:=fn:concat($roleType,",","Role4") return roleType) 
        else if (Engg5/text()="true") 
         then (let $roleType:=fn:concat($roleType,",","Role5") return roleType) 
        else (fn:data($roleType)) 
        } 

あなたが動的要素のローカル名のうち、役割の数を解析することによって、リストを生成することができ、事前

答えて

0

ありがとう:

let $roles := 
    for $e in $doc/EnggTypes/* 
    let $local-name := local-name($e) 
    let $regex := '^Engg(\d+)$' 
    let $number := replace($local-name, '^Engg(\d+)$', '$1') 
    where ($e eq 'true') 
    return concat('Role', $number) 
return string-join($roles, ',') 
0

あなたは

<RoleTypes>{ 
     string-join($x/*[matches(local-name(), 'Engg[0-9]')] 
         [.='true'] 
        /concat('Role', substring(local-name(), 5, 1)), ',') 
}</RoleTypes> 
としてRoleTypesを形成することができます
関連する問題