Вывод символа 'SUB' в файл CSV при отображении из XML в карту XSLT - PullRequest
1 голос
/ 24 июня 2019

Наш клиент хочет, чтобы в конце файла CSV был символ «SUB», чтобы получатель правильно обработал файл.

Я получил в документе Excel, где символ отображается правильно. Я включил это здесь.

Преобразование этого в HEX дает: 1a

В своем коде XSLT я попытался вывести этот символ с помощью скрипта CSharp:

public string OutputEndOfFileCharacterSUB()
{
     return '\u001A'.ToString();
}

Но когда я собираю и проверяю это, я получаю сообщение об ошибке:

Ошибка компиляции XSLT. '', шестнадцатеричное значение 0x1A, недопустимо характер.

У меня вопрос: как правильно вывести этот символ в XSLT? Это невозможно, или я должен использовать другого персонажа?

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

Вы можете использовать System.BitConverter для преобразования этого шестнадцатеричного вывода в строку.

public string OutputEndOfFileCharacterSUB()
{
     byte[] hexString = Encoding.ASCII.GetBytes('\u001A'.ToString());
     return System.BitConverter.ToString(hexString);
}
0 голосов
/ 24 июня 2019

Я думаю, что у вас есть два варианта: либо переключиться на парсер, поддерживающий XML версии 1.1, где в XML разрешена числовая ссылка на символ, например , и вы можете вставить / вывести такой символ в свой XSLT-код или использовать эксплойтMicrosoft добавила в свои API-интерфейсы XML, чтобы не поддерживать XML 1.1, но тем не менее разрешает такие ссылки на символы с XmlReaderSettings / XmlWriterSettings, где для свойства CheckCharacters установлено значение false.

Последнее предложение требует загрузки таблицы стилей XSLT, где выиспользовать ссылку на символ с соответствующими XmlReaderSettings, а также записывать результат таблицы стилей с тем же XmlWriterSettings:

        XmlReaderSettings xrs = new XmlReaderSettings() { CheckCharacters = false };

        XslCompiledTransform xsltProc = new XslCompiledTransform();

        using (XmlReader xr = XmlReader.Create("sheet.xslt", xrs))
        {
            xsltProc.Load(xr);
        }

        XmlWriterSettings xws = xsltProc.OutputSettings.Clone();
        xws.CheckCharacters = false;

        using (XmlWriter xw = XmlWriter.Create("result.csv, xws))
        {
            xsltProc.Transform("input.xml", null, xw);
        }

В XSLT, где вы хотите вывести символ, вы должны использовать ссылку на символ .

Первое предложение возможно, например, путем переключения на Saxon 9 .NET, поскольку он поставляется с IKVM и кросс-компилированным синтаксическим анализатором XML на основе Java, который обрабатывает версии XML 1.0 и 1.1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...