Obter valor após cada último dois pontos

Preciso obter o valor de cada dado após o último dois pontos. Por exemplo, eu tenho este arquivo:

<Data>
:20:PmtReferenceID000012
:21:Not used
:25: PHMNLBICXXX/Account00010203
:28c:00001/0001 (The 'c' in :28 can be either in upper or lower case)

:20:PmtReferenceID000012
:21:Not used
:25: PHMNLBICXXX/Account00010203
:28c:00001/0001 (The 'c' in :28 can be either in upper or lower case)
</Data>

Preciso armazenar o valor após o ': 20:' para<ABCD>, ': 21:' para<EFGH>, ': 25:' para<IJKL> e ': 28c:' para<MNOP>.

Aqui está o meu XSLT:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="Data">
    <Data>
        <xsl:variable name="OneLine" select="replace(translate(.,'&#10;', '|'),'&#xD;','')"/>
        <ABCD>
            <xsl:value-of select="substring-before(substring-after($OneLine, ':20:'),'|:')"/>
        </ABCD>
        <EFGH>
            <xsl:value-of select="substring-before(substring-after($OneLine, ':21:'),'|:')"/>
        </EFGH>
        <IJKL>
            <xsl:value-of select="substring-before(substring-after($OneLine, ':25:'),'|:')"/>
        </IJKL>
        <MNOP>
            <xsl:value-of select="substring-before(substring-after($OneLine, ':28c:'),'|:')"/>
        </MNOP>
    </Data>
</xsl:template>

Saída esperada:

<Data>
   <ABCD>PmtReferenceID000012</ABCD>
   <EFGH>Not used</EFGH>
   <IJKL> PHMNLBICXXX/Account00010203</IJKL>
   <MNOP>00001/0001</MNOP>
</Data>
<Data>
   <ABCD>PmtReferenceID000012</ABCD>
   <EFGH>Not used</EFGH>
   <IJKL> PHMNLBICXXX/Account00010203</IJKL>
   <MNOP>00001/0001</MNOP>
</Data>

O que fiz foi substituir primeiro o retorno de carro para pipe ('|'), para que, se eu obtiver o valor, por exemplo, o ': 20:', procurarei o '|' e substring o valor após o ': 20:' e antes do '|'. Existe uma maneira fácil de obter o valor após cada dois pontos, porque há tantas chaves, se vou usar o método que fiz? Estou pensando em usar um índice ou posição e armazenar todas as chaves (: 20:,: 21:,: 25:,: 28c '), para que, se o próximo registro contiver': 21: 'ou': 25 : 'ou': 28c ', ele obterá o valor antes dessa chave. Mas, eu não tenho nenhuma idéia de como farei isso usando xslt.

Os seus comentários são extremamente apreciados!

Obrigado,

questionAnswers(3)

yourAnswerToTheQuestion