XQuery将多个xml元素转换为一个连接的目标元素

时间:2017-06-07 14:28:56

标签: xml xquery

我希望转换源xml并将几个字段组合成逗号分隔文本中的单个目标字符串元素。

条件源输入(Engg1到5)是布尔类型,仅当值为true时才应包含在目标列表中

E.g。 XML

<Root-Element>
<EnggTypes>
<EnggFN>ABC<EnggFN>
<EnggLN>XYZ<EnggLN>
<EnggEML>abc.xyz@junk.com</EnggEML>
<Engg1>true</Engg1>
<Engg2>true</Engg2>
<Engg3>false</Engg3>
<Engg4>false</Engg4>
<Engg5>true</Engg5>
</EnggTypes>
</Root-Element>

预期转变

<Root-Element>
<EnggFN>ABC<EnggFN>
<EnggLN>XYZ<EnggLN>
<EnggEML>abc.xyz@junk.com</EnggEML>
<RoleTypes>Role1,Role2,Role5</RoleTypes>
</Root-Element>

希望在XQuery 1.0中实现相同的目标

我开始过度思考并尝试使用局部变量来查看是否可以执行其他操作如果使用先前的值构造字符串并连接但似乎不起作用,因为变量值一旦设置就无法更改! / p>

{ 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))
                  }

赞赏任何投入。

提前致谢

2 个答案:

答案 0 :(得分: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, ',')

答案 1 :(得分:0)

您可以将RoleTypes形成为

<RoleTypes>{
      string-join($x/*[matches(local-name(), 'Engg[0-9]')]
                      [.='true']
                    /concat('Role', substring(local-name(), 5, 1)), ',')
}</RoleTypes>