string-length()
, как и все XSLT / XPath, основано на символах, а не на байтах, поэтому string-length("Ãbcd")
обязательно должно дать 4. Если оно дает 5, то либо:
Ваш Ã
на самом деле представляет собой два отдельных символа, один из которых представляет собой диакритический символ тильды, и это действительно правильно, даже если это означает, что столбцы визуально не выстраиваются.Но я думаю, что, вероятно, нет, так как версия, которую вы вставили здесь, представляет собой один составной символ, U + 00C3 LATIN CAPITAL LETTER A WITH TILDE.или
ваш входной XML был прочитан с использованием неправильной кодировки, фактически он находится в UTF-8 (по умолчанию для XML), но читался как-то еще, обычно ISO-8859-1, в результате чего символ U + 00C3, представленный последовательностью байтов 0xC3,0x83, выходит в виде двух символов U + 00C3, U + 0083 (Ã
).
Это непросто «странные европейские символы», о которых вам нужно беспокоиться;если вы неправильно используете Unicode, то все символов вне основного 7-битного набора ASCII будут искажены, в том числе многие, которые даже замкнутые американцы любят использовать.
В любом случаевопрос о том, что SAP хочет для своего формата ввода FWV.Все это очень хорошо обрабатывает Ã
как один символ и добавляет правильное количество символов заполнения для одного символа, но если вы затем выводите в UTF-8, а SAP на самом деле не читает UTF-8, это все равно нарушитimport.
Вам необходимо выяснить кодировку, ожидаемую целевой установкой SAP (если это не UTF-8, cp1252 - еще одна хорошая попытка), а также выяснить, является ли фиксированнаястолбцы формата основаны на символах Unicode или байтах.Из этого (связанного?) spec Я полагаю, что они на самом деле основаны на байтах, и в этом случае 5 будет на самом деле правильной длины байта, если ваша база данных должна содержать UTF-8.
К сожалению, XSLT полностью посвящен символам и не дает вам возможности работать с байтами, поэтому, если входной файл основан на байтах, вам придется либо:
удалитьвсе символы, не входящие в ASCII, ставящие спорными, или
используют другой инструмент вне XSLT для выполнения этой обработки, который знает о байтах.Честно говоря, для меня это имеет смысл: XSLT идеально подходит для преобразований XML в XML и в значительной степени ужасен для других задач обработки строк.Ваш шаблон выше можно сделать более читабельным и эффективным, переписав его за пару строк современного языка сценариев, такого как Python.