需要在xslt中显示字符

需要在xslt中显示字符,xslt,Xslt,大家好 我正在使用XSLT1.0。我的字符代码为FOA7,必须显示为相应的字符。我的意见是 我的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,'

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

我的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>

它将错误显示为错误:
“在字符引用中,十进制表示必须紧跟在“&#”之后。”

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


<span font-family="{@w:font}">
    <xsl:value-of select="concat('&amp;#x', @w:char, ';')" 
        disable-output-escaping="yes"/>
</span>
尽管检查@Eamon Nerbonne的答案,为什么你根本不应该这么做。



尽管检查@Eamon Nerbonne的答案,为什么你根本不应该这么做。

使用“&;”对于输出中的“&”:

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

使用“&;”对于输出中的“&”:

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

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

  • 您使用
    concat
    的解决方案是无效的:XSLT不仅仅是一个花哨的字符串连接器,它实际上转换了概念树。编码字符,如
    和#xf0a7
    是一个单个字符-如果您要以某种方式包括字母
    &
    f
    0
    a
    7
    那么XSLT处理器需要在XML数据中包含这些字母,而不是字符串!所以这意味着它会逃脱他们
  • XSLT1.0中没有允许将数字转换为具有该代码点的字符的功能
  • 在XSLT2.0中,正如Michael Kay指出的,可以使用
    codepoints-to-string()
    来实现这一点
有两种解决办法。首先,您可以使用
禁用输出转义
。这相当讨厌,而且不便于携带。如果可以的话,不惜一切代价避免这种情况——但它可能会在您的变压器中工作,而且它可能是唯一通用、简单的解决方案,因此您可能无法避免这种情况

第二种解决方案是对每个字符进行硬编码匹配。这通常是一个混乱的局面,但如果你处理的是一组有限的可能性,那是很有可能的——这取决于你的具体问题

最后,我建议不要在XSLT中解决这个问题——这通常是您可以在另一个编程环境中更恰当地进行预处理/后处理的事情。最有可能的是,您有一个XML文档的内存表示,可以首先使用XSLT,在这种情况下,这甚至不会占用太多CPU时间。

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

  • 您使用
    concat
    的解决方案是无效的:XSLT不仅仅是一个花哨的字符串连接器,它实际上转换了概念树。编码字符,如
    和#xf0a7
    是一个单个字符-如果您要以某种方式包括字母
    &
    f
    0
    a
    7
    那么XSLT处理器需要在XML数据中包含这些字母,而不是字符串!所以这意味着它会逃脱他们
  • XSLT1.0中没有允许将数字转换为具有该代码点的字符的功能
  • 在XSLT2.0中,正如Michael Kay指出的,可以使用
    codepoints-to-string()
    来实现这一点
有两种解决办法。首先,您可以使用
禁用输出转义
。这相当讨厌,而且不便于携带。如果可以的话,不惜一切代价避免这种情况——但它可能会在您的变压器中工作,而且它可能是唯一通用、简单的解决方案,因此您可能无法避免这种情况

第二种解决方案是对每个字符进行硬编码匹配。这通常是一个混乱的局面,但如果你处理的是一组有限的可能性,那是很有可能的——这取决于你的具体问题


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

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

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

这将在浏览器中显示为
&xF0A7
。这将在浏览器中显示为
&xF0A7
。+1。我同意,虽然解决办法似乎很简单,但后果可能非常艰难。如果XML设计是好的,这个问题就永远不会发生。Earmon Nerbonne:您写道“这在(合理的)XSLT中是不可能的”。这是错误的,正如Michael Kay博士回答的那样,您可能忽略了XPath/XSLT 2.0函数,我将XSLT 2.0选项作为要点之一。我同意,虽然解决办法似乎很简单,但后果可能非常艰难。如果XML设计是好的,这个问题就永远不会发生。Earmon Nerbonne:您写道“这在(合理的)XSLT中是不可能的”。这是错误的,正如Michael Kay博士回答的那样,您可能忽略了XPath/XSLT 2.0函数,我将XSLT 2.0选项作为要点之一。请参见我的答案,您如何做到,以及@Eamon Nerbonne的答案,为什么您根本不应该做到。请参见我的答案,您如何做到,以及@Eamon Nerbonne的答案,为什么你根本不应该这么做;在这种特殊情况下,这可能是唯一的办法,但根本不理想;在这个特定的例子中,这可能是唯一的方法,但它一点也不理想。+1一般正确答案。没有任何东西阻止对XSLT 2.0的更新。@Alejandro。这很难解释。简而言之,考虑非java 2实现的数量。@ FLACK:有.NET的实现