WSO2 XSLT中全局变量在for-each赋值后外部访问问题
XSLT循环外访问循环内计算值的解决方案
问题根源
XSLT中的变量是不可变的,你在for-each循环内声明的$UPDATE_FLAG是局部变量,和外部同名变量完全独立,外部变量始终保持初始空值,这就是循环外无法获取循环内赋值结果的原因。
解决方案
既然你确认循环中只会有一次赋值(即仅一个data节点满足id != $CUSTOMER_ID),可以直接用XPath表达式提前计算出目标值,无需在循环内尝试赋值。修改后的代码如下:
<xsl:template match="/"> <xsl:if test="$CALL_FROM = 'CREATE_CUSTOMER'"> <customerData xmlns=""> <!-- 直接通过XPath获取符合条件的id值,无匹配则为空 --> <xsl:variable name="UPDATE_FLAG" select="/jsonObject/data[id != $CUSTOMER_ID]/id"/> <ContactInfo> <xsl:if test="$FLAG = 'True'"> <xsl:for-each select="/jsonObject/data"> <Address> <AddressLine1> <xsl:value-of select="address1"/> </AddressLine1> <AddressLine2> <xsl:value-of select="address2"/> </AddressLine2> <Country> <xsl:value-of select="country"/> </Country> <Code> <xsl:value-of select="code"/> </Code> </Address> </xsl:for-each> </xsl:if> </ContactInfo> <UpdateRequiredFlag> <xsl:value-of select="$UPDATE_FLAG"/> </UpdateRequiredFlag> </customerData> </xsl:if> </xsl:template>
说明
select="/jsonObject/data[id != $CUSTOMER_ID]/id"会自动选取第一个满足id != $CUSTOMER_ID的data节点的id值,若没有匹配节点则变量为空,完全符合你原代码的逻辑。- 移除了循环内的局部变量声明,避免变量名混淆,同时保证外部变量能正确获取目标值。
内容的提问来源于stack exchange,提问作者Ruby
相关产品推荐
相关产品推荐

