Je dois obtenir la valeur de chaque donnée après le dernier deux-points. Par exemple, j'ai ce fichier:Récupère la valeur après chaque dernier deux-points
<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>
je dois stocker la valeur après ': 20:' à <ABCD>
, ': 21:' à <EFGH>
, ': 25:' à <IJKL>
et « : 28c : 'à <MNOP>
.
Voici mon 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>
Sortie prévue:
<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>
Ce que je l'ai dit, je remplace d'abord le retour chariot à la conduite ('|'), donc cela, si je reçois la valeur par exemple le ': 20:', je chercherai le '|' et sous-chaîne la valeur après ': 20:' et avant le '|'. Est-ce qu'il y a un moyen facile d'obtenir la valeur après chaque dernier deux-points parce qu'il y a tellement de clés, si je vais utiliser la méthode que j'ai faite? Je pense à utiliser un index ou une position, et stocker toutes les clés (: 20:,: 21:, 25:,: 28c '), de sorte que si l'enregistrement suivant contient': 21: 'ou': 25 : 'ou': 28c ', il aura la valeur avant cette clé. Mais, je n'ai aucune idée sur comment vais-je faire cela en utilisant xslt.
Vos commentaires sont les bienvenus!
Merci,
RE votre edit: s'il vous plaît expliquer la règle exacte ** ** par lequel les données sont réparties. Y a-t-il un double saut de ligne séparant les blocs, ou autre chose? Et le modèle se répète-t-il vraiment, ou est-ce juste une coïncidence? –