显示True Type Font Personalized xslt 1.0

时间:2013-12-17 15:40:06

标签: xml ms-word xslt-1.0

这是我的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.

1 个答案:

答案 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的版本似乎可行。 : - )