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

发布于 2024-10-27 08:24:03 字数 264 浏览 1 评论 0 原文

这是我的输入 html (xhtml)

<SPAN style="font-family: wingdings"></SPAN>

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

<w:sym w:font="wingdings" w:char="F0D8"/>

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

This is my input html (xhtml)

<SPAN style="font-family: wingdings"></SPAN>

I want to create an xml node like the following

<w:sym w:font="wingdings" w:char="F0D8"/>

How to get the character Unicode hexadecimal valude (F0D8) from the html: suggest a template for this.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

瞎闹 2024-11-03 08:24:03

我所做的事情与 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>

代码int-to-hex 函数由 提供伊夫·福克尔。输出是:

<?xml version="1.0" encoding="UTF-8"?>
<sym char="F0D8"/>

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

I was doing exactly the same thing as Michael Kay suggested in his answer :) Anyway, here is my code

<?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>

The int-to-hex function is courtesy of Yves Forkl. The output is:

<?xml version="1.0" encoding="UTF-8"?>
<sym char="F0D8"/>

I don't know how to do this using XSLT 1.0.

天赋异禀 2024-11-03 08:24:03

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

In XSLT 2.0 you can get the numeric value of the character using the string-to-codepoints() function. You'll have to write a function to convert it to hex yourself, but that's not difficult.

吐个泡泡 2024-11-03 08:24:03

@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>

There is one error in @MarcoS's function: instead of if ($in gt 16) should be if ($in ge 16) (greater then or equal). Wrong hexadecimal values were generated for example for number 259.

The full function should looks like this:

<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>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文