这是我的输入html(xhtml)
<SPAN style="font-family: wingdings"></SPAN>
我想创建一个xml节点,如下所示
<w:sym w:font="wingdings" w:char="F0D8"/>
如何从html获取字符Unicode十六进制valude(F0D8):为此建议一个模板。
答案 0 :(得分:5)
我做的事与Michael Kay中建议的his answer完全相同:)无论如何,这是我的代码
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
xmlns:my="http://www.example.com/my"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
version="2.0"
exclude-result-prefixes="fn my xs">
<xsl:output method="xml" indent="yes" omit-xml-declaration="no"/>
<xsl:function name="my:int-to-hex" as="xs:string">
<xsl:param name="in" as="xs:integer"/>
<xsl:sequence
select="if ($in eq 0)
then '0'
else
concat(if ($in gt 16)
then my:int-to-hex($in idiv 16)
else '',
substring('0123456789ABCDEF',
($in mod 16) + 1, 1))"/>
</xsl:function>
<xsl:template match="//SPAN">
<sym>
<xsl:attribute name="char">
<xsl:value-of select="my:int-to-hex(
fn:string-to-codepoints(.))"/>
</xsl:attribute>
</sym>
</xsl:template>
</xsl:stylesheet>
int-to-hex
功能由Yves Forkl提供。输出是:
<?xml version="1.0" encoding="UTF-8"?>
<sym char="F0D8"/>
我不知道如何使用XSLT 1.0来做到这一点。
答案 1 :(得分:3)
在XSLT 2.0中,您可以使用string-to-codepoints()
函数获取字符的数值。你必须自己编写一个函数将它转换为十六进制,但这并不困难。
答案 2 :(得分:0)
@MarcoS的功能中有一个错误:而不是if ($in gt 16)
应该是if ($in ge 16)
(大于或等于)。例如,对于数字259,生成了错误的十六进制值。
完整功能应如下所示:
<xsl:function name="my:int-to-hex" as="xs:string">
<xsl:param name="in" as="xs:integer"/>
<xsl:sequence
select="if ($in eq 0)
then '0'
else
concat(if ($in ge 16)
then my:int-to-hex($in idiv 16)
else '',
substring('0123456789ABCDEF',
($in mod 16) + 1, 1))"/>
</xsl:function>