2015-12-11 2 views
0

Я генерирую идентификатор с помощью generate-id(), я конвертирую этот идентификатор в числа, используя строки для кодовых точек.xslt 2.0 удаляет пробелы из строки в код.

Как удалить пробелы из полученного числа?

Так, например, результирующие кодовые точки «17 28 39 28», но мне нужно «17283928».

Перевести не работает, потому что он ожидает строку. И я не могу преобразовать число в строку, потому что string() не может обрабатывать пробелы.

Как я могу это достичь?

+1

Можете ли вы показать нам пример кода, 'string-to-codepoints' даст вам последовательность чисел' xs: integer'. Что вы делаете с последовательностью, когда говорите, что получаете '17 28 39 28'? Если вы используете '', тогда у вас должна быть строка. Если вы используете 'value-of', то просто установите, например. ''. –

+0

Вы уже ответили на вопрос. Я могу использовать xsl: value-of ... Я использовал string-to-codepoints (generate-id()) в шаблоне значения атрибута. Но xsl: value-of преобразует его в строку автоматически, я даже не думал об этом !! Большое спасибо! – user3629892

+0

Я поместил свои предложения и улучшения на основе вашего объяснения использования шаблона значения атрибута в ответ, чтобы вы могли пометить свой вопрос как решаемый. –

ответ

2

На основе вашего комментария вы использовали string-to-codepoints(generate-id()) в шаблоне значения атрибута в шаблоне значения атрибута, если выражение оценивается в последовательности, а затем вставляется разделительный список значений последовательности. Вам нужно либо использовать string-join для последовательности, чтобы построить одну строку, либо вам нужно построить строку за пределами шаблона значения атрибута, как позволяет <xsl:value-of select="string-to-codepoints(generate-id())" separator=""/>.

Ниже приведен пример использования string-join:

<xsl:template match="foo"> 
    <bar id="{string-join(for $n in string-to-codepoints(generate-id()) return string($n), '')}" /> 
</xsl:template> 

который будет построить результирующий элемент, так <bar id="1004910149"/> без пробелов в значении атрибута.

+0

Отлично! Я продолжаю забывать, что новый синтаксис XPath даже существует: D Спасибо! – user3629892

+0

Вы можете упростить это до 'id =" {string-join (string-to-codepoints (generate-id())}} "в XSLT 3.0. –

0

(Не ответ, но слишком длинный для комментария).

Интересное дополнение: этот алгоритм гарантирует уникальные ключи?

Может ли быть две различные строки, такие, что функция string-join(string-to-codepoints($x)!string(), '') создает ту же строку цифр?

Я думаю, вам повезло, потому что generate-id() гарантированно создаст строки, состоящие только из буквенно-цифровых символов ASCII. Это означает, что все символы должны иметь кодовые обозначения в диапазоне от 48 до 122, что означает, что каждый кодовой номер преобразуется в 2 или 3 цифры, и, посмотрев на первую цифру, вы можете определить, является ли она 2-значной или 3-значной последовательностью ,

Прежде чем я это обработал, я собирался предположить, что вы набиваете коды с нулями, чтобы сделать все последовательности одинаковой длины.

+0

Что касается дополнения: возможно ли в XSLT изменить generate-id() таким образом, чтобы вы могли указать количество символов? Например. создать функцию generate-id (14), которая дает уникальный идентификатор с 14 символами? – user3629892

+0

Если вы можете придумать алгоритм, то я уверен, что он может быть закодирован в XSLT; но я не могу сразу думать об эффективном алгоритме. –

+0

Я скорее думал, что generate-id должен принести это поведение. Я не знаю, как Saxon реализует эту функцию, но в Java можно создать случайную буквенно-цифровую строку фиксированной длины, не так ли? – user3629892

Смежные вопросы