需要在xslt中显示char

时间:2011-02-09 12:05:09

标签: xslt

大家好 我正在使用xslt 1.0。我的字符代码为FOA7,必须显示为相应的字符。我的意见是

<w:sym w:font="Wingdings" w:char="F0A7"/>

我的xslt模板是

<xsl:template match="w:sym">
    <xsl:variable name="char" select="@w:char"/>
    <span font-family="{@w:fonts}">        
    <xsl:value-of select="concat('&#x',$char,';')"/>
    </span>
</xsl:template>

它将错误显示为ERROR:'A decimal representation must immediately follow the "&#" in a character reference.'

请帮我解决这个问题..提前谢谢...

4 个答案:

答案 0 :(得分:2)

<span font-family="{@w:font}">
    <xsl:value-of select="concat('&amp;#x', @w:char, ';')" 
        disable-output-escaping="yes"/>
</span>

虽然查看@Eamon Nerbonne的答案,但为什么你根本不应该这样做。

答案 1 :(得分:2)

这在(合理的)XSLT中是不可能的。你可以解决它。

  • 使用concat的解决方案无效:XSLT不仅仅是一个奇特的字符串连接器,它实际上转换了概念。编码字符(例如&#xf0a7;)是单个字符 - 如果您以某种方式包含字母& # x f 0 {{ 1}} a 7然后XSLT处理器需要在XML 数据中包含这些字母 - 而不是字符串!这意味着它将逃脱它们。
  • XSLT 1.0中没有允许从数字转换为具有该代码点的字符的功能。
  • 在XSLT 2.0中,正如Michael Kay指出的那样,您可以使用;来实现这一目标。

有两种解决方案。首先,您可以使用codepoints-to-string()。这是相当讨厌和不便携。如果可以的话,不惜一切代价避免这种情况 - 但它可能适用于您的变压器,它可能是唯一一般的简单解决方案,因此您可能无法避免这种情况。

第二种解决方案是对每个角色进行硬编码匹配。这通常是一团糟,但如果你正在处理一组有限的可能性,这很可能 - 这取决于你的具体问题。

最后,我建议在XSLT中解决这个问题 - 这通常是你可以在另一个编程环境中的前/后处理中做得更恰当的事情。最有可能的是,你在XML文档的内存中表示能够首先使用XSLT,在这种情况下,这甚至不会花费太多的CPU时间。

答案 2 :(得分:1)

如果您使用的是XSLT 2.0(您不是),您可以编写一个函数将十六进制转换为十进制,然后对结果使用codepoints-to-string()。

答案 3 :(得分:0)

使用'&amp; amp;'为'&amp;'在输出中:

<xsl:value-of select="concat('&amp;#x',$char,';')"/>