在 Dataweave 2.0 中选择第一个 DTOSteps 时如何停止迭代?
How to stop the iteration when the first DTOSteps are selected in Dataweave 2.0?
在我的例子中,我正在尝试更新 @CoverageCd == "TRIA" 的 DTOSteps(第一个子节点)值。
但是我的数据编织代码更新了@CoverageCd == "TRIA" 的所有 DTOStep。假设这段代码中的变量returns一些值。
我的 Dataweave 代码:
%dw 2.0
var multiChar = "X"
output application/xml
fun TRIAtransformSteps(x, index)=
x match {
case is Object -> x mapObject
if ($$ as String == "DTOSteps")
{
DTOSteps: TRIAtransformNewSteps()
}
else
(($$): TRIAtransformSteps($, index+1))
else -> $
}
fun TRIAtransformNewSteps()=
{
DTOStep @(Order:vars.Desc[0], Name:"Rate Area: "++ vars.Desc ++ " TRIA",Desc:vars.Desc ++ " TRIA Layer Premium", Operation:"+", Factor: vars.drcvalues.TRIACharge , Value:vars.drcvalues.TRIACharge ): null
}
fun TRIAtransformCoverage(x, index)=
x match {
case is Object -> x mapObject
if ($$ as String == "DTOCoverage" and $$.@CoverageCd == "TRIA")
{
DTOCoverage @(( $$.@ ) ): TRIAtransformSteps($, index)
}
else
(($$): TRIAtransformCoverage($, index+1))
else -> $
}
---
TRIAtransformCoverage(payload,1)
输入负载:https://github.com/Manikandan99/java-code-to-dataweave-2/blob/main/input_xml_request_TRIA.xml
获取输出:https://github.com/Manikandan99/java-code-to-dataweave-2/blob/main/My_output.xml
预期输出:https://github.com/Manikandan99/java-code-to-dataweave-2/blob/main/Expected_output.xml
如何在选择第一个 DTOSteps 时中断迭代?
如果元素是其parent元素的第一个child,那么可以使用mapObject()和filterobject()函数的第三个参数,索引.经常被遗忘的是,它们有三个参数: (value,key,index)
。如果没有命名,默认情况下可以引用为 $$$
。可以加个条件判断是不是第一个child.
对于这种情况,如果索引是第一个(即 index==0
),您可以使用 filterObject() 仅保留所需的键。
条件可以是例如:
x filterObject ($$ as String == "DTOSteps" and $$$ == 0)
mapObject if ..
请提供所用变量的值。要获得输出,您需要更改 TRIAtransformSteps
函数,如下所示
fun TRIAtransformSteps(x, index)=
x match {
case is Object -> x mapObject
if ($$ as String == "DTOSteps")
{
DTOSteps: TRIAtransformNewSteps()
}
else
(($$): $)
else -> $
}
在我的例子中,我正在尝试更新 @CoverageCd == "TRIA" 的 DTOSteps(第一个子节点)值。
但是我的数据编织代码更新了@CoverageCd == "TRIA" 的所有 DTOStep。假设这段代码中的变量returns一些值。
我的 Dataweave 代码:
%dw 2.0
var multiChar = "X"
output application/xml
fun TRIAtransformSteps(x, index)=
x match {
case is Object -> x mapObject
if ($$ as String == "DTOSteps")
{
DTOSteps: TRIAtransformNewSteps()
}
else
(($$): TRIAtransformSteps($, index+1))
else -> $
}
fun TRIAtransformNewSteps()=
{
DTOStep @(Order:vars.Desc[0], Name:"Rate Area: "++ vars.Desc ++ " TRIA",Desc:vars.Desc ++ " TRIA Layer Premium", Operation:"+", Factor: vars.drcvalues.TRIACharge , Value:vars.drcvalues.TRIACharge ): null
}
fun TRIAtransformCoverage(x, index)=
x match {
case is Object -> x mapObject
if ($$ as String == "DTOCoverage" and $$.@CoverageCd == "TRIA")
{
DTOCoverage @(( $$.@ ) ): TRIAtransformSteps($, index)
}
else
(($$): TRIAtransformCoverage($, index+1))
else -> $
}
---
TRIAtransformCoverage(payload,1)
输入负载:https://github.com/Manikandan99/java-code-to-dataweave-2/blob/main/input_xml_request_TRIA.xml
获取输出:https://github.com/Manikandan99/java-code-to-dataweave-2/blob/main/My_output.xml
预期输出:https://github.com/Manikandan99/java-code-to-dataweave-2/blob/main/Expected_output.xml
如何在选择第一个 DTOSteps 时中断迭代?
如果元素是其parent元素的第一个child,那么可以使用mapObject()和filterobject()函数的第三个参数,索引.经常被遗忘的是,它们有三个参数: (value,key,index)
。如果没有命名,默认情况下可以引用为 $$$
。可以加个条件判断是不是第一个child.
对于这种情况,如果索引是第一个(即 index==0
),您可以使用 filterObject() 仅保留所需的键。
条件可以是例如:
x filterObject ($$ as String == "DTOSteps" and $$$ == 0)
mapObject if ..
请提供所用变量的值。要获得输出,您需要更改 TRIAtransformSteps
函数,如下所示
fun TRIAtransformSteps(x, index)=
x match {
case is Object -> x mapObject
if ($$ as String == "DTOSteps")
{
DTOSteps: TRIAtransformNewSteps()
}
else
(($$): $)
else -> $
}