需要在xslt中显示字符
大家好 我正在使用XSLT1.0。我的字符代码为FOA7,必须显示为相应的字符。我的意见是需要在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,'
我的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('&#x', @w:char, ';')"
disable-output-escaping="yes"/>
</span>
尽管检查@Eamon Nerbonne的答案,为什么你根本不应该这么做。
尽管检查@Eamon Nerbonne的答案,为什么你根本不应该这么做。使用“&;”对于输出中的“&”:
<xsl:value-of select="concat('&#x',$char,';')"/>
使用“&;”对于输出中的“&”:
<xsl:value-of select="concat('&#x',$char,';')"/>
这在(合理的)XSLT中是不可能的。你可以解决这个问题
- 您使用
的解决方案是无效的:XSLT不仅仅是一个花哨的字符串连接器,它实际上转换了概念树。编码字符,如concat
是一个单个字符-如果您要以某种方式包括字母和#xf0a7
&
f
0
a
7
那么XSLT处理器需要在XML数据中包含这些字母,而不是字符串!所以这意味着它会逃脱他们 - XSLT1.0中没有允许将数字转换为具有该代码点的字符的功能
- 在XSLT2.0中,正如Michael Kay指出的,可以使用
来实现这一点codepoints-to-string()
禁用输出转义
。这相当讨厌,而且不便于携带。如果可以的话,不惜一切代价避免这种情况——但它可能会在您的变压器中工作,而且它可能是唯一通用、简单的解决方案,因此您可能无法避免这种情况
第二种解决方案是对每个字符进行硬编码匹配。这通常是一个混乱的局面,但如果你处理的是一组有限的可能性,那是很有可能的——这取决于你的具体问题
最后,我建议不要在XSLT中解决这个问题——这通常是您可以在另一个编程环境中更恰当地进行预处理/后处理的事情。最有可能的是,您有一个XML文档的内存表示,可以首先使用XSLT,在这种情况下,这甚至不会占用太多CPU时间。这在(合理的)XSLT中是不可能的。你可以解决这个问题
- 您使用
的解决方案是无效的:XSLT不仅仅是一个花哨的字符串连接器,它实际上转换了概念树。编码字符,如concat
是一个单个字符-如果您要以某种方式包括字母和#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的实现