xslt:将字符转换为十六进制Unicode表示形式

vig*_*esh 6 xslt

这是我的输入html(xhtml)

<SPAN style="font-family: wingdings">?</SPAN>
Run Code Online (Sandbox Code Playgroud)

我想创建一个如下所示的xml节点

<w:sym w:font="wingdings" w:char="F0D8"/>
Run Code Online (Sandbox Code Playgroud)

如何从html获取字符Unicode十六进制valude(F0D8):为此建议一个模板.

Mar*_*coS 5

我和Michael Kay他的回答中提出了完全相同的事情:)无论如何,这是我的代码

<?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>
Run Code Online (Sandbox Code Playgroud)

int-to-hex功能由Yves Forkl提供.输出是:

<?xml version="1.0" encoding="UTF-8"?>
<sym char="F0D8"/>
Run Code Online (Sandbox Code Playgroud)

我不知道如何使用XSLT 1.0来做到这一点.


Mic*_*Kay 3

在 XSLT 2.0 中,您可以使用该函数获取字符的数值string-to-codepoints()。您必须自己编写一个函数将其转换为十六进制,但这并不困难。