xslt: преобразование символов в их шестнадцатеричное представление Unicode - PullRequest
6 голосов
/ 30 марта 2011

Это мой ввод html (xhtml)

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

Я хочу создать узел xml, подобный следующему

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

Как получить шестнадцатеричное значение символа Unicode (F0D8) из html: предложить шаблон для этого.

Ответы [ 3 ]

5 голосов
/ 30 марта 2011

Я делал то же самое, что Майкл Кей предложил в его ответ :) В любом случае, вот мой код

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

3 голосов
/ 30 марта 2011

В XSLT 2.0 вы можете получить числовое значение символа, используя функцию string-to-codepoints(). Вам нужно написать функцию, чтобы преобразовать ее в шестнадцатеричный код самостоятельно, но это не сложно.

0 голосов
/ 01 февраля 2014

В функции @ 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...