2016-07-26 4 views
1

Ich habe eine Situation, in der ich ein oder mehrere Fonds innerhalb eines Policy-Datensatzes durchlaufen muss, die mit dem Code TVFIR1 suchen und den Zinssatz dieses Datensatzes verwenden. Dies ist eine super vereinfachte Version des XML-Datensatz:Ausbrechen einer Schleife in XSL

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

Dies ist, was ich in Pseudo-Code zu erreichen, bin mit dem Ziel:

For each fund 
    If the fund code = ‘TVFIR1 Then 
    Get its interest rate 
    Break out of the loop 
    Else 
    Interest rate = 0 
    End If 

Weiter Fonds Rekord

Die Logik Ich mag würde verwenden, wird in XSL nicht unterstützt, weil Sie nicht aus einer for-each-Schleife ausbrechen können (es handelt sich nicht um eine prozedurale Sprache!).

Antwort

1

Warum Schleife, wenn Sie dies in einem Ausdruck tun können? Ich glaube, das XPATH für Sie arbeiten würde:

/Policy/Fund[FundCode='TVFIR1']/InterestRate || number(0) 

, dass der Wert der Zinsrate, deren FundCode ist ‚TVFIR1‘ oder die Nummer 0, wenn es nicht vorhanden ist wählen würde. Verwenden Sie das einfach als Wert einer Variablen.

+0

Das ist kein gültiger XPath-Ausdruck. –

+0

Ich denke, dass Sie auf den Ausdruck XPath 2.0 zielen '(/ Policy/Fund [FundCode = 'TVFIR1'] [1]/InterestRate, 0) [1]' –

+0

Ich würde @MichaelKay immer vertrauen ... Ich lief Dieser Xpath in Oxygen (2.0) hat keinen Fehler bekommen und den FundCode auf verschiedene Werte geändert und es schien zu funktionieren. –

1

Ich würde Sie es auf diese Weise vorschlagen versuchen:

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

Dies wird vorausgesetzt, Sie verwenden XSLT 1.0.


Wenn Sie XSLT 2.0 verwenden, dann können Sie dies verkürzen:

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

Ich würde Ihnen raten, „clever“ Tricks zu vermeiden, die auf den ersten kühlen scheinen mag, aber Sie kosten wird (oder Ihr Nachfolger) Zeit später, wenn Sie versuchen zu entziffern, was genau sie tun.

Wie Sie selbst angegeben haben, ist dies ein "wenn dann sonst" -Problem und sollte als solches gelöst werden - auch wenn die Lösung ein wenig wortreich erscheint.