大家好 我正在使用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.'
请帮我解决这个问题..提前谢谢...
答案 0 :(得分:2)
<span font-family="{@w:font}">
<xsl:value-of select="concat('&#x', @w:char, ';')"
disable-output-escaping="yes"/>
</span>
虽然查看@Eamon Nerbonne的答案,但为什么你根本不应该这样做。
答案 1 :(得分:2)
这在(合理的)XSLT中是不可能的。你可以解决它。
concat
的解决方案无效:XSLT不仅仅是一个奇特的字符串连接器,它实际上转换了概念树。编码字符(例如
)是单个字符 - 如果您以某种方式包含字母&
#
x
f
0
{{ 1}} a
7
然后XSLT处理器需要在XML 数据中包含这些字母 - 而不是字符串!这意味着它将逃脱它们。;
来实现这一目标。有两种解决方案。首先,您可以使用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('&#x',$char,';')"/>