动态替换给定数据中的子字符串(XML固定长度)

时间:2019-03-28 08:00:22

标签: xslt-2.0

实际上,我最近开始从事XSLT工作,但在解决其中一项要求方面面临困难。

我正在尝试从提到的输入中的DATA元素中获取子字符串,即ECHO和OKAY,这些代码需要替换为同一输入中CODE / ECHO和CODE / OKAY下的值。我曾尝试将子字符串存储在变量中,并且由于变量值和标记值相同,因此我尝试在中获取它。但是它不起作用。

是我们不能在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>

输入:

        <?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 000000000000010000ECHO00400300000000000XXXXXX 000{  P 2018-11-05</DATA>
                </item>
                <item>
                    <DATA>000000    ABCD   EF     0000000000 2018-11-060000000000EF 000000000000010000OKAY00400300000000000XXXXXX 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 :(得分:0)

<xsl:template match="INPUT|CODES">
</xsl:template>

<xsl:template match="TABLES">
    <xsl:variable name="break" select="'&#xA;'" />
    <xsl:for-each select="T_ER/item"><xsl:value-of select="$break"></xsl:value-of>
        <xsl:value-of select="DATA"/>
    </xsl:for-each>
</xsl:template>