这是我的xml:
<SECTION_CONTENT_LIST_ITEM>
<NTC_LIGHTLISTPRODUCT>
<IMMUTABLE_ID>9849</IMMUTABLE_ID>
<LIGHT_STRUCTURE>
<STRUCTURE_DESCRIPTION>Boa \A a fuso \B segnale \C speciale \D</STRUCTURE_DESCRIPTION>
</LIGHT_STRUCTURE>
</NTC_LIGHTLISTPRODUCT>
</SECTION_CONTENT_LIST_ITEM>
将注意力集中在“结构描述”字段上: 你可以看到:“Boa \ A a fuso \ B segnale \ C speciale \ D”
对应的值\ A,\ B,\ C,\ D我的xslt代码打开一个真正的类型字体文件并将这个\ a或\ b或\ c或\ d转换为一个特殊的不同字符。
我的xslt代码:
<xsl:template name="simboli">
<xsl:param name="testo"/>
<xsl:param name="separatore"/>
<xsl:choose>
<xsl:when test="contains($testo, $separatore)">
<xsl:value-of select="substring-before($testo, $separatore)"/>
<span style="font-family:lol;font-size:9pt;">
<xsl:value-of select= "substring(., string-length(substring-before($testo, $separatore)) +2, 1)"/>
</span>
<xsl:call-template name="simboli">
<xsl:with-param name="testo" select="substring(substring-after($testo, $separatore), 2, string-length(substring-after($testo, $separatore)))"/>
<xsl:with-param name="separatore" select="$separatore"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$testo"/>
</xsl:otherwise>
</xsl:choose>
你可以看到我使用font-family = lol&lt; ---自定义字体
<span style="font-family:lol;font-size:9pt;">
<xsl:value-of select= "substring(., string-length(substring-before($testo, $separatore)) +2, 1)"/>
</span>
我用Microsoft Word打开这个XML文件,我选择Xslt文件,然后输出后得到:
Boa A a fuso f segnale u speciale s
字母f,u和s应该是LOL的特殊字符。
我的问题是:为什么只转换第一个字符?
N.B:我控制XSLT并且运行正确,唯一的问题是只转换第一个\ A并跳转\ B \ C \ D.
答案 0 :(得分:1)
你有一个小错误
<xsl:value-of select= "substring(., string-length(substring-before($testo, $separatore)) +2, 1)"/>
在这里,您希望将字符串的开头输出到分隔符。您使用当前上下文.
来引用整个字符串。这在初始调用模板时工作正常。当您递归时,.
仍将指向初始字符串,因为显然<xsl:call-template>
不会更改上下文。相反,您要做的是将传递的字符串的子字符串作为testo
:
<xsl:value-of select= "substring($testo, string-length(substring-before($testo, $separatore)) +2, 1)"/>
顺便说一下:如果不是
<xsl:with-param name="testo" select="substring(substring-after($testo, $separatore), 2, string-length(substring-after($testo, $separatore)) - 1)"/>
计算剩余子字符串的长度?但是,没有-1
的版本似乎可行。 : - )