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(.,' ', '|'),'
','')"/>
<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,