我必须通过XSLT转换XML文件,其中包含不同字体类型的字符,例如Symbol,Wingdings,Webdings等。
输入如下:
<p><schar font="Webdings" nr="0081"></schar></p>
为了处理它,我写了一个函数如下:
<xsl:function name="resolveWebdingsFont" as="xs:string">
<xsl:param name="hexcode" as="xs:string"/>
<xsl:param name="fallback" as="xs:string"/>
<xsl:variable name="hexkey" select="upper-case(replace($hexcode, '^0*(.+)', '$1'))" as="xs:string"/>
<xsl:variable name="newchar" select="$webdings-character-map[@hex = $hexkey]/@to" as="xs:string?"/>
<xsl:value-of select="if ($newchar) then $newchar else $fallback"/>
</xsl:function>
我把字符映射放在一个变量中:
<xsl:variable name="webdings-character-map" as="element(char)+">
....
<char hex="81" to="🚺"/>
<!-- Womens symbol -->
...
</xsl:variable>
我这样称呼函数:
<xsl:template match="schar">
<span data-type="schar">
<xsl:choose>
<xsl:when test="@font = 'Symbol'">
<xsl:value-of select="dy:resolveSymbolFont(@nr, .)"/>
</xsl:when>
<xsl:when test="@font = 'Webdings'">
<xsl:value-of select="dy:resolveWebdingsFont(@nr, .)"/>
</xsl:when>
...
</xsl:choose>
</span>
</xsl:template>
所需的输出为<span>
,其中unicode表示为其值,这适用于Symbol等字体类型。
要正确映射所有Webdings字符,我需要一个包含所有Webdings字符及其unicode表示的完整列表。
使用unicode 7.0版(2014年6月),它们已经集成。但规范说:
众所周知的“Zapf Dingbats”集合全面编码 标志挡,U + 2700 ..U + 27BF。其他的装饰品,如 Wingdings和Webdings集合以各种符号块编码,但是 大多数都出现在杂项符号和象形文字中 块,U + 1F300..U + 1F5FF。“
据我了解,我们必须查看每个块以获得所有字符及其等价物的完整列表;但这是我想避免的。即使我找到一个看起来类似于某个Webdings符号的符号,我也无法确定它是否正式用于表示它。其他人甚至看起来并不相似,但有意代表他们。
我找不到任何官方文件。 是否存在从Webdings到unicode的官方映射?
或者是否有一种完全不同/更好的方法将特殊字符转换为XSLT中的unicode? p>
答案 0 :(得分:0)
要正确映射所有Webdings字符,我需要一个 所有Webdings字符及其unicode的完整列表 表示。
AFAIK,您只需要将61440添加到十进制代码值即可。在您的示例中,
将变为
。这适用于Webdings和Windings / Windings2 / Windings3字体 - 我不确定其他人。