Я использую движок ms xslt 1.0.
Я хочу создать необработанный вывод xml следующим образом:
<Cell ss:StyleID = "s27"><Data ss:Type = "String">Catchup (Yes), FVOD(No), SVOD (No)</Data></Cell>
Обратите внимание
встроенный в вывод.
как мне получить это в xslt?
Если я сделаю это:
<Cell ss:StyleID = "s27">
<Data ss:Type = "String">
<xsl:text>Catchup (Yes), </xsl:text>
<xsl:text disable-output-escaping = "yes"><![CDATA[ ]]></xsl:text>
<xsl:text>SVOD (No)</xsl:text>
</Data>
</Cell>
я понимаю это
<ss:Cell ss:StyleID = "s27">
<ss:Data ss:Type = "String">Catchup (Yes), &#10;SVOD (No)</ss:Data>
</ss:Cell>
что неправильно! (ну, не то, что я хочу)
Если я попытаюсь
<xsl:text disable-output-escaping = "yes">&#10;</xsl:text>
Я получаю тот же результат
Если я попробую очевидное
<xsl:text>Catchup (Yes), SVOD (No)</xsl:text>
я получил
<ss:Data ss:Type = "String">Catchup (Yes),
SVOD (No)</ss:Data>
то есть это новая строка.
для других, смотрящих на этот вопрос, я не уверен на 100%, что это за вопрос, не говоря уже об ответе, и я попытаюсь уточнить.
кажется, что ответ michael.hor257k работает в некоторых контекстах. (так что на самом деле то, что я пытаюсь, работает в каком-то контексте)
<xsl:text disable-output-escaping = "yes">&#10;</xsl:text>
это работает, если я жестко кодирую вывод и запускаю его в механизме XSLT, используемом VS2022.
он не работает против моей довольно "ванильной" реализации XSLT C# против XSLTTransform и XSLTCompiledTransform.
Мне также не ясно, работает ли он с настройкой VS2022 в моем производственном коде (который не просто жестко кодирует некоторый вывод, но выполняет гинастику appytemplate и nodeset).
я добавлю это к вопросу
tbh, я не хочу жестко кодировать выходную строку, я хочу разграничить набор узлов с помощью символов перевода строки
Я все еще не вижу проблемы. Символ
— это символ LF. Неважно, как это представлено на выходе (и я сомневаюсь, что у вас есть контроль над тем, как это представлено с помощью процессора MS).
нет представляет собой 6-символьное представление LF...LF - это LF...т.е. персонаж ЛФ. excel ожидает, что 6-символьное представление LF будет встроено в неразобранный xml.... оно будет игнорировать символ LF.
Я не знаю, что такое Эксель. В XML строка
является точным эквивалентом символа LF, и соответствующий синтаксический анализатор будет анализировать их одинаково. В любом случае, ваш вопрос не о XSLT как таковом, а об управлении сериализацией результата преобразования. И ответ зависит от процессора.
Я согласен с тем, что мой инстинкт заключается в том, что Excel использует какой-то нестандартный синтаксический анализ XML, и то, что я прошу, - это механизм для создания потенциально недопустимого XML, НО я надеялся, что CDATA был этим механизмом, но кажется, что в по крайней мере, с msxslt вы не можете форсировать сериализованные данные - tbh, я думаю, что это совершенно правильный вопрос. Я попробую в Саксонии, может быть.
Если вы действительно готовы прибегнуть к использованию disable-output-escaping
, чтобы получить требуемый результат, рассмотрите следующий пример:
XSLT 1.0
<xsl:stylesheet version = "1.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
<xsl:output method = "xml" version = "1.0" encoding = "UTF-8" indent = "yes"/>
<xsl:template match = "/">
<Cell>
<xsl:text>Alpha</xsl:text>
<xsl:text disable-output-escaping = "yes">&#10;</xsl:text>
<xsl:text>Bravo</xsl:text>
<xsl:text disable-output-escaping = "yes">&#10;</xsl:text>
<xsl:text>Charlie</xsl:text>
</Cell>
</xsl:template>
</xsl:stylesheet>
Результат
<?xml version = "1.0"?>
<Cell>Alpha Bravo Charlie</Cell>
Однако это зависит от поддержки процессором disable-output-escaping
. Судя по примерам в вашем вопросе, процессор, который вы используете, не работает. Вы говорите, что это движок Microsoft, но я получаю желаемый результат с обоими процессорами MS здесь: https://xsltfiddle.liberty-development.net/6qLZFRw
Также обратите внимание, что disable-output-escaping
имеет значение только на этапе вывода. Если вы не пишете на выходе, это не имеет никакого эффекта.
как очень странно... Я запускаю это в визуальной студии (очевидно, снова на движке msxslt)... и... это работает! Я запускаю его в коде C# с движком msxslt, и это не так, он ведет себя как мой код в моем исходном примере.
Как я уже сказал, XSLT-процессор не требуется для поддержки disable-output-escaping
. Возможно, в используемой вами конфигурации сериализация выполняется другим звеном в цепочке обработки.
хотя это действительно странно..... я сериализую прямо в поток памяти из преобразования.
нет... происходит что-то еще, чего я не понимаю, ваш ответ ДЕЙСТВИТЕЛЬНО работает, учитывая мой простой пример, но он не работает в моем производственном коде... мне придется воспроизвести, я отмечу это как хотя ответь
интересно узнать, как код xsltfiddle настраивает свои преобразования, происходит что-то странное... Visual Studio соответствует xslt fiddle, но мой симпатичный ванильный код C# не работает, и этот ms engnie общеизвестно идиосинкразичен
если вы упомянете тот факт, что код должен быть в выходной сериализации в 1.0, я отмечу это как ответ, на данный момент это может ввести в заблуждение.
Я добавил примечание по этому поводу. Я думаю, вы ошибаетесь, думая, что это версия (несмотря на "аберрацию" XSLT 1.1). Уж точно не с процессором MS.
да, возможно, вы правы, хотя с моей реализацией происходит что-то странное
Это не ответ, а уточнение. Я считаю, что этот вопрос не имеет ничего общего с xslt , я добавил excel.
Как сказал michael.hor257k, две сериализации (
и перевод строки) должны быть эквивалентны. Но когда я открываю следующий файл XML с помощью Excel
<?xml version = "1.0"?>
<?mso-application progid = "Excel.Sheet"?>
<Workbook xmlns = "urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o = "urn:schemas-microsoft-com:office:office"
xmlns:x = "urn:schemas-microsoft-com:office:excel"
xmlns:ss = "urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html = "http://www.w3.org/TR/REC-html40">
<Styles>
<Style ss:ID = "wrap">
<Alignment ss:Horizontal = "Left" ss:Vertical = "Top"/>
</Style>
</Styles>
<Worksheet ss:Name = "Summary">
<Table>
<Row>
<Cell ss:StyleID = "wrap">
<Data ss:Type = "String">Catchup (Yes), FVOD (No), SVOD (No)</Data>
</Cell>
<Cell ss:StyleID = "wrap"><Data ss:Type = "String">Catchup (Yes),
FVOD (No),
SVOD (No)</Data>
</Cell>
</Row>
</Table>
</Worksheet>
</Workbook>
две ячейки ведут себя по-разному, но только в строке формул:
FWIW, я вижу такое же поведение в LibreOffice. По-видимому, ни LF, ни
недостаточно для правильного восстановления исходных разрывов строк в ячейке. Интересно, что когда я вставляю разрывы строк вручную и экспортирую результат, значения разделяются LF.
Разрывы строк в ячейках появляются, когда вы устанавливаете ячейки для «переноса текста». Но разница в Formula Bar остается.
см. ответ Майкла Кея на stackoverflow.com/questions/75460450/…. Вопрос действительно имеет отношение к XSLT, спецификации XSLT и механизмам XSLT, и для него, по крайней мере, хорошо известная проблема, если, возможно, не та, которая должна быть решаема на языке.
Я могу открыть файл в Excel, и данные отображаются по-разному между двумя разными кодировками.
Я не понимаю, как здесь уместно «переносить текст»; Я ввел 3 значения, разделенные командой-возвратом. Обтекание текстом отключено для ячейки, но все 3 значения отображаются постоянно (вся строка имеет высоту 3 строки).
С "переносом текста" это выглядит так: i.stack.imgur.com/UIIXj.png
@MrDatKookerellaLtd Проблема (представленная вами) решаема на языке XSLT; однако вы должны применять disable-output-escaping
на этапе вывода, а не раньше, и вы должны использовать процессор, поддерживающий disable-output-escaping
.
@ michael.hor257k - на самом деле достаточно честно, просто это не работает для моего контекста, но вы правы.
Был дополнительный вопрос с помеченным ответом.
Лучше всего читать это, резюме.
Надев шляпу Excel, я изменил реализацию, чтобы экспортировать несколько строк, а не пытаться поместить несколько строк в одну ячейку.
Почему вы не можете просто жестко запрограммировать элемент Cell таким, какой он есть?