实际上,我最近开始从事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="'
'" />
<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
答案 0 :(得分:0)
给人的印象是,您在写书时会想像
Root/CODES/$String
并且$String
的值为"ECHO"
,那么这等同于书写
Root/CODES/ECHO
变量不是这样工作的。变量表示值,而不是表达式文本的片段(XPath不是宏语言)。 Root/CODES/$String
的实际含义是Root/CODES/"ECHO"
,即“对于Root/CODES
中的每个元素,返回字符串"ECHO"
”。
我认为您正在寻找的是类似的东西
Root/CODES/*[name()=$String]