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

时间:2019-03-28 09:32:26

标签: xslt-2.0

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

我正在尝试从提到的输入中的DATA元素中获取子字符串,即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>

输入:

  <?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 :(得分:0)

给人的印象是,您在写书时会想像

Root/CODES/$String

并且$String的值为"ECHO",那么这等同于书写

Root/CODES/ECHO

变量不是这样工作的。变量表示值,而不是表达式文本的片段(XPath不是宏语言)。 Root/CODES/$String的实际含义是Root/CODES/"ECHO",即“对于Root/CODES中的每个元素,返回字符串"ECHO"”。

我认为您正在寻找的是类似的东西

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