Динамически заменить подстроку в данных (XML на фиксированную длину) - PullRequest
0 голосов
/ 28 марта 2019

На самом деле я недавно приступил к работе с XSLT, и мне трудно решить одно из требований.

Я пытаюсь извлечь подстроку из элемента DATA в упомянутом входе i, e - ECHO, и OKAY, эти коды должны быть заменены значениями, присутствующими в CODE / ECHO и CODE / OKAY на том же входе. Я пытался сохранить подстроку в переменной, и поскольку значение переменной и значение тега были бы одинаковыми, я попытался получить это в <xsl:value-of select="Root/CODES/$String" />. Но это не работает.

Это то, что мы не можем использовать переменные в XPATHS или есть какое-то другое представление, которое нужно использовать? Может ли кто-нибудь помочь мне с этим.

      <?xml version="1.0" encoding="UTF-8"?>
     <xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fn="http://www.w3.org/2005/xpath-functions">
<xsl:output omit-xml-declaration="yes" />
<xsl:param name="break" select="'&#xA;'" />
<xsl:template match="/">

        <xsl:variable name="String" select="substring(DATA, (string-length(substring(DATA,0,77)) + 1), 4)" />

        <xsl:variable name="String1" >
            <xsl:value-of select="Root/CODES/$String" />
        </xsl:variable> 
        <xsl:value-of select="$break" />
        <xsl:value-of select="$String1" />
    </xsl:for-each>
</xsl:template>

INPUT:

  <?xml version='1.0' encoding='utf-8'?>
    <ROOT>
        <INPUT>
            <I_FILENAME>ERES</I_FILENAME>
        </INPUT>
        <CODES>
             <ECHO>A1</ECHO>
             <OKAY>A2</OKAY> 
        </CODES>
        <TABLES>
            <T_ER>
                <item>
                    <DATA> HEADERERESRGCITIS220190301124112000000RGERSD46</DATA>
                </item>
                <item>
                    <DATA>000000    ABCD   EF     0000000000 2018-11-060000000000EF 000000000000010000A100400300000000000XXXXXX 000{  P 2018-11-05</DATA>
                </item>
                <item>
                    <DATA>000000    ABCD   EF     0000000000 2018-11-060000000000EF 000000000000010000A200400300000000000XXXXXX 000{  P 2018-11-05</DATA>
                </item>
                <item>
                    <DATA>TRAILERERESRGCITIS220190301124112000000001570000</DATA>
                </item>
            </T_ER>
        </TABLES>
    </ROOT>

ОЖИДАЕМЫЙ ВЫХОД:

         HEADERERESRGCITIS220190301124112000000RGERSD46
     000000    ABCD   EF     0000000000 2018-11-060000000000EF 000000000000010000A100400300000000000XXXXXX 000{  P 2018-11-05
     000000    ABCD   EF     0000000000 2018-11-060000000000EF 000000000000010000A200400300000000000XXXXXX 000{  P 2018-11-05

1 Ответ

0 голосов
/ 31 марта 2019

У меня сложилось впечатление, что вы представляете, что когда вы пишете

Root/CODES/$String

и значение $String равно "ECHO", тогда это эквивалентно записи

Root/CODES/ECHO

Это не так, как работают переменные. Переменные представляют значения, а не фрагменты текста выражения (XPath не является языком макросов). На самом деле Root/CODES/$String означает Root/CODES/"ECHO", то есть 'для каждого элемента в Root/CODES возвращает строку "ECHO"'.

Я думаю, что вы ищете что-то вроде

Root/CODES/*[name()=$String]
...