我有一种情况,我需要在政策记录中循环一个或多个基金,找到具有代码TVFIR1的那个并使用该记录的利率。这是XML记录的超简化版本:
<Policy>
<PolicyNumber>123456789</PolicyNumber>
<PolicyOwner>John Doe</PolicyOwner>
<Fund>
<FundCode>TVSPM3</FundCode>
<InterestRate>0</InterestRate>
</Fund>
<Fund>
<FundCode>TVFIR1</FundCode>
<InterestRate>0.025</InterestRate>
</Fund>
<Fund>
<FundCode>TVMDP5</FundCode>
<InterestRate>0</InterestRate>
</Fund>
</Policy>
这是我打算用伪代码实现的目标:
For each fund
If the fund code = ‘TVFIR1 Then
Get its interest rate
Break out of the loop
Else
Interest rate = 0
End If
下一个基金记录
我想要使用的逻辑在XSL中不受支持,因为你不能打破for-each循环(它不是一种过程语言!)。
答案 0 :(得分:1)
为什么在一个表达式中可以循环?我相信这个XPATH会对你有用:
/Policy/Fund[FundCode='TVFIR1']/InterestRate || number(0)
这将选择其FundCode为&#39; TVFIR1&#39;的InterestRate的值。如果不存在,则为数字0。只需将其用作变量的值。
答案 1 :(得分:1)
我建议你这样试试:
<xsl:template match="/Policy">
<!-- other stuff -->
<xsl:variable name="fund" select="Fund[FundCode='TVFIR1']" />
<xsl:choose>
<xsl:when test="$fund">
<xsl:value-of select="$fund/InterestRate"/>
</xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
<!-- more stuff -->
</xsl:template>
这假设你正在使用XSLT 1.0。
如果您使用的是XSLT 2.0,则可以将其缩短为:
<xsl:template match="/Policy">
<!-- other stuff -->
<xsl:variable name="fund" select="Fund[FundCode='TVFIR1']" />
<xsl:value-of select="if ($fund) then $fund/InterestRate else 0"/>
<!-- more stuff -->
</xsl:template>
我会建议你避免一开始可能看起来很酷的“聪明”技巧,但是当你试图破译它们究竟是什么时,会花费你(或你的继任者)的时间。
正如你自己指出的那样,这是一个“如果不是其他”的问题,应该这样解决 - 即使解决方案似乎有点冗长。