在XSL中打破循环

时间:2016-07-26 17:33:05

标签: xslt

我有一种情况,我需要在政策记录中循环一个或多个基金,找到具有代码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循环(它不是一种过程语言!)。

2 个答案:

答案 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>

我会建议你避免一开始可能看起来很酷的“聪明”技巧,但是当你试图破译它们究竟是什么时,会花费你(或你的继任者)的时间。

正如你自己指出的那样,这是一个“如果不是其他”的问题,应该这样解决 - 即使解决方案似乎有点冗长。