2016-04-11 1 views
1

Есть ли какая-либо функция xslt для извлечения длины байта строки.Длина байта строки в xslt

Для. например: i ♥ u

Длина символов, полученная длиной строки = 5
Длина байта, которая мне нужна = 7 байт.

+1

В какой кодировке вы хотите, чтобы вычислить длину байт? Строка не имеет длины байта без учета конкретной кодировки. Посмотрите, поможет ли http://expath.org/spec/binary#encode-string. –

ответ

2

Предполагая, что есть поддержка бинарного модуля EXPath, то вы можете использовать bin:length(bin:encode-string('i ♥ u')), как в

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" 
    xmlns:bin="http://expath.org/ns/binary"> 

    <xsl:template name="main" match="/"> 
     <xsl:value-of select="for $enc in ('UTF-8', 'UTF-16') return bin:length(bin:encode-string('i ♥ u', $enc))"/> 
    </xsl:template> 

</xsl:transform> 
0

Вы также можете играть некоторые трюки с iri-to-uri().

Попробуйте это:

  1. Применить iri-to-uri() к строке
  2. Преобразование любых %xx последовательностей в результате к одному ASCII символа с помощью replace() функции
  3. Длина результирующей строки является количество байтов в представлении UTF-8 исходной строки.

Например string-length(replace(iri-to-uri('§'), '%..', '%')) => 2

Также протестирована на вашем примере.

0

А вот другой подход (опять же при условии, UTF-8 кодировки):

sum(for $c in string-to-codepoints($in) 
    return (1 + number($c>127) + number($c>2047) + number($c>65535)))