用于复杂负载的 Eclipse Xquery
Eclipse Xquery For Complex payload
我有如下输入请求
<Input>
<BusinessObjects>
<BusinessObject>
<BusinessIdentifiers>
<BusinessIdentifier>
<BKey>BuCode</BKey>
<BValue>CDC</BValue>
</BusinessIdentifier>
<BusinessIdentifier>
<BKey>BuType</BKey>
<BValue>123</BValue>
</BusinessIdentifier>
<BusinessIdentifier>
<BKey>CsmNo</BKey>
<BValue>857895</BValue>
</BusinessIdentifier>
</BusinessIdentifiers>
</BusinessObject>
<BusinessObject>
<BusinessIdentifiers>
<BusinessIdentifier>
<BKey>BuCode</BKey>
<BValue>CDC</BValue>
</BusinessIdentifier>
<BusinessIdentifier>
<BKey>BuType</BKey>
<BValue>123</BValue>
</BusinessIdentifier>
<BusinessIdentifier>
<BKey>CsmNo</BKey>
<BValue>34567</BValue>
</BusinessIdentifier>
</BusinessIdentifiers>
</BusinessObject>
</BusinessObjects>
</Input>
我需要形成如下模式的输出
<Output>
<BusinessObject>
<BIKey></BIKey>
<BKey></BIKey>
<Bvalue></Bvalue>
<BOID></BOID>
</BusinessObject>
</Output>
对于上面的payload
输出应该是
<Output>
<BusinessObjects>
<BusinessObject>
<BIKey>CDC:123:857895|CDC:123:34567</BIKey>
<BKey>BUCode</BKey>
<Bvalue>CDC</Bvalue>
<BOID>CDC:123:857895</BOID>
</BusinessObject>
<BusinessObject>
<BIKey>CDC:123:857895|CDC:123:34567</BIKey>
<BKey>BUtype</BKey>
<Bvalue>123</Bvalue>
<BOID>CDC:123:857895</BOID>
</BusinessObject>
<BusinessObject>
<BIKey>CDC:123:857895|CDC:123:34567</BIKey>
<BKey>CSMNo</BKey>
<Bvalue>857895</Bvalue>
<BOID>CDC:123:857895</BOID>
</BusinessObject>
<BusinessObject>
<BIKey>CDC:123:857895|CDC:123:34567</BIKey>
<BKey>BUCode</BKey>
<Bvalue>CDC</Bvalue>
<BOID>CDC:123:34567</BOID>
</BusinessObject>
<BusinessObject>
<BIKey>CDC:123:857895|CDC:123:34567</BIKey>
<BKey>BUtype</BKey>
<Bvalue>123</Bvalue>
<BOID>CDC:123:34567</BOID>
</BusinessObject>
<BusinessObject>
<BIKey>CDC:123:857895|CDC:123:34567</BIKey>
<BKey>CSMNo</BKey>
<Bvalue>857895</Bvalue>
<BOID>CDC:123:34567</BOID>
</BusinessObject>
</BusinessObjects>
</Output>
我已经尝试在 Xquery 下获得相同的结果,但最终出现错误或不符合要求
<Ouput>
<BusinessObjects>
{
for $bi in Input/BusinessObjects/BusinessObject/BusinessIdentifiers/BusinessIdentifier
return
<BIKey>
{
string-join(
for $bo in Input/BusinessObjects/BusinessObject return string-join($bo/BusinessIdentifiers/BusinessIdentifier/BValue, '|'),
':'
)
}
</BIKey>
<BKey>data {$bi/Bkey}</BKey>
<Bvalue>data {$bi/Bvalue}</Bvalue>
for $bo in Input/BusinessObjects/BusinessObject return <BOID>{string-join($bo//BValue, ':')}<BOID>
}
</BusinessObjects>
</Ouput>
输出字段说明如下
BIKey
-->它由 'Business Identifier' 的所有 B 值与“:”连接而成,然后对于每个业务对象,它用“|”分隔
Bkey
-->直接用bkey映射
Bvalue
-->直接用B值映射
BOID
--> 它必须为每个业务对象形成,需要将业务标识符的值 B 值与“:”连接起来
任何建议,我相信我必须在这里有两个复杂的循环,但无法破解它。
感谢@Martin,他帮助我使用“ancestor
”轴破解了这个问题,但有些 eclispe 无法识别“ancestor
”。
谢谢
所有输出的 BIKey 都是相同的,因此我们可以在任何循环之外计算它并完成它。为此,我们将 BusinessObject 的所有 BValues 与 :
连接起来,并将每个 BusinessObject 的结果与 |
连接起来:
let $BIKey := string-join(for $bo in /Input/BusinessObjects/BusinessObject return string-join($bo/BusinessIdentifiers/BusinessIdentifier/BValue, ':'), '|')
BOID 将取决于我们正在处理的 BusinessObject,因此我们需要遍历这些对象,然后我们可以在此时提取 BOID:
let $BIKEY := [...]
for $bo in /Input/BusinessObjects/BusinessObject
let $BOID := string-join($bo/BusinessIdentifiers/BusinessIdentifier/BValue, ':')
其余输出字段取决于 BusinessIdentifier,因此让我们也循环处理这些字段,return 每个 BusinessIdentifier 一个 BusinessObject :
let $BIKEY := [...]
for $bo in [...]
let $BOID := [...]
return for $bi in $bo/BusinessIdentifiers/BusinessIdentifier/
return <BusinessObject>
<BIKey>{$BIKEY}</BIKey>
<BKey>{$bi/BKey}</BKey>
<Bvalue>{$bi/Value}</Bvalue>
<BOID>{$BOID}</BOID>
</BusinessObject>
现在我们需要做的就是将这些输出的 BusinessObjects 包装到它们的父标签中:
<output><BusinessObjects>{
let $BIKEY := string-join(for $bo in /Input/BusinessObjects/BusinessObject return string-join($bo/BusinessIdentifiers/BusinessIdentifier/BValue, ':'), '|')
for $bo in /Input/BusinessObjects/BusinessObject
let $BOID := string-join($bo/BusinessIdentifiers/BusinessIdentifier/BValue, ':')
return
for $bi in $bo/BusinessIdentifiers/BusinessIdentifier
return <BusinessObject>
<BIKey>{$BIKEY}</BIKey>
<BKey>{$bi/BKey/text()}</BKey>
<Bvalue>{$bi/BValue/text()}</Bvalue>
<BOID>{$BOID}</BOID>
</BusinessObject>
}</BusinessObjects></output>
你可以test it here.
我有如下输入请求
<Input>
<BusinessObjects>
<BusinessObject>
<BusinessIdentifiers>
<BusinessIdentifier>
<BKey>BuCode</BKey>
<BValue>CDC</BValue>
</BusinessIdentifier>
<BusinessIdentifier>
<BKey>BuType</BKey>
<BValue>123</BValue>
</BusinessIdentifier>
<BusinessIdentifier>
<BKey>CsmNo</BKey>
<BValue>857895</BValue>
</BusinessIdentifier>
</BusinessIdentifiers>
</BusinessObject>
<BusinessObject>
<BusinessIdentifiers>
<BusinessIdentifier>
<BKey>BuCode</BKey>
<BValue>CDC</BValue>
</BusinessIdentifier>
<BusinessIdentifier>
<BKey>BuType</BKey>
<BValue>123</BValue>
</BusinessIdentifier>
<BusinessIdentifier>
<BKey>CsmNo</BKey>
<BValue>34567</BValue>
</BusinessIdentifier>
</BusinessIdentifiers>
</BusinessObject>
</BusinessObjects>
</Input>
我需要形成如下模式的输出
<Output>
<BusinessObject>
<BIKey></BIKey>
<BKey></BIKey>
<Bvalue></Bvalue>
<BOID></BOID>
</BusinessObject>
</Output>
对于上面的payload 输出应该是
<Output>
<BusinessObjects>
<BusinessObject>
<BIKey>CDC:123:857895|CDC:123:34567</BIKey>
<BKey>BUCode</BKey>
<Bvalue>CDC</Bvalue>
<BOID>CDC:123:857895</BOID>
</BusinessObject>
<BusinessObject>
<BIKey>CDC:123:857895|CDC:123:34567</BIKey>
<BKey>BUtype</BKey>
<Bvalue>123</Bvalue>
<BOID>CDC:123:857895</BOID>
</BusinessObject>
<BusinessObject>
<BIKey>CDC:123:857895|CDC:123:34567</BIKey>
<BKey>CSMNo</BKey>
<Bvalue>857895</Bvalue>
<BOID>CDC:123:857895</BOID>
</BusinessObject>
<BusinessObject>
<BIKey>CDC:123:857895|CDC:123:34567</BIKey>
<BKey>BUCode</BKey>
<Bvalue>CDC</Bvalue>
<BOID>CDC:123:34567</BOID>
</BusinessObject>
<BusinessObject>
<BIKey>CDC:123:857895|CDC:123:34567</BIKey>
<BKey>BUtype</BKey>
<Bvalue>123</Bvalue>
<BOID>CDC:123:34567</BOID>
</BusinessObject>
<BusinessObject>
<BIKey>CDC:123:857895|CDC:123:34567</BIKey>
<BKey>CSMNo</BKey>
<Bvalue>857895</Bvalue>
<BOID>CDC:123:34567</BOID>
</BusinessObject>
</BusinessObjects>
</Output>
我已经尝试在 Xquery 下获得相同的结果,但最终出现错误或不符合要求
<Ouput>
<BusinessObjects>
{
for $bi in Input/BusinessObjects/BusinessObject/BusinessIdentifiers/BusinessIdentifier
return
<BIKey>
{
string-join(
for $bo in Input/BusinessObjects/BusinessObject return string-join($bo/BusinessIdentifiers/BusinessIdentifier/BValue, '|'),
':'
)
}
</BIKey>
<BKey>data {$bi/Bkey}</BKey>
<Bvalue>data {$bi/Bvalue}</Bvalue>
for $bo in Input/BusinessObjects/BusinessObject return <BOID>{string-join($bo//BValue, ':')}<BOID>
}
</BusinessObjects>
</Ouput>
输出字段说明如下
BIKey
-->它由 'Business Identifier' 的所有 B 值与“:”连接而成,然后对于每个业务对象,它用“|”分隔
Bkey
-->直接用bkey映射
Bvalue
-->直接用B值映射
BOID
--> 它必须为每个业务对象形成,需要将业务标识符的值 B 值与“:”连接起来
任何建议,我相信我必须在这里有两个复杂的循环,但无法破解它。
感谢@Martin,他帮助我使用“ancestor
”轴破解了这个问题,但有些 eclispe 无法识别“ancestor
”。
谢谢
所有输出的 BIKey 都是相同的,因此我们可以在任何循环之外计算它并完成它。为此,我们将 BusinessObject 的所有 BValues 与 :
连接起来,并将每个 BusinessObject 的结果与 |
连接起来:
let $BIKey := string-join(for $bo in /Input/BusinessObjects/BusinessObject return string-join($bo/BusinessIdentifiers/BusinessIdentifier/BValue, ':'), '|')
BOID 将取决于我们正在处理的 BusinessObject,因此我们需要遍历这些对象,然后我们可以在此时提取 BOID:
let $BIKEY := [...]
for $bo in /Input/BusinessObjects/BusinessObject
let $BOID := string-join($bo/BusinessIdentifiers/BusinessIdentifier/BValue, ':')
其余输出字段取决于 BusinessIdentifier,因此让我们也循环处理这些字段,return 每个 BusinessIdentifier 一个 BusinessObject :
let $BIKEY := [...]
for $bo in [...]
let $BOID := [...]
return for $bi in $bo/BusinessIdentifiers/BusinessIdentifier/
return <BusinessObject>
<BIKey>{$BIKEY}</BIKey>
<BKey>{$bi/BKey}</BKey>
<Bvalue>{$bi/Value}</Bvalue>
<BOID>{$BOID}</BOID>
</BusinessObject>
现在我们需要做的就是将这些输出的 BusinessObjects 包装到它们的父标签中:
<output><BusinessObjects>{
let $BIKEY := string-join(for $bo in /Input/BusinessObjects/BusinessObject return string-join($bo/BusinessIdentifiers/BusinessIdentifier/BValue, ':'), '|')
for $bo in /Input/BusinessObjects/BusinessObject
let $BOID := string-join($bo/BusinessIdentifiers/BusinessIdentifier/BValue, ':')
return
for $bi in $bo/BusinessIdentifiers/BusinessIdentifier
return <BusinessObject>
<BIKey>{$BIKEY}</BIKey>
<BKey>{$bi/BKey/text()}</BKey>
<Bvalue>{$bi/BValue/text()}</Bvalue>
<BOID>{$BOID}</BOID>
</BusinessObject>
}</BusinessObjects></output>
你可以test it here.