Как получить новые строки excel в электронной таблице ML (MSXSLT)

Я использую движок ms xslt 1.0.

Я хочу создать необработанный вывод xml следующим образом:

<Cell ss:StyleID = "s27"><Data ss:Type = "String">Catchup (Yes), &#10;FVOD(No), &#10;SVOD (No)</Data></Cell>

Обратите внимание

&#10;

встроенный в вывод.

как мне получить это в xslt?

Если я сделаю это:

        <Cell ss:StyleID = "s27">
            <Data ss:Type = "String">
                <xsl:text>Catchup (Yes), </xsl:text>
                <xsl:text disable-output-escaping = "yes"><![CDATA[&#10;]]></xsl:text>
                <xsl:text>SVOD (No)</xsl:text>
            </Data>
        </Cell>

я понимаю это

    <ss:Cell ss:StyleID = "s27">
      <ss:Data ss:Type = "String">Catchup (Yes), &amp;#10;SVOD (No)</ss:Data>
    </ss:Cell>

что неправильно! (ну, не то, что я хочу)

Если я попытаюсь

<xsl:text disable-output-escaping = "yes">&amp;#10;</xsl:text>

Я получаю тот же результат

Если я попробую очевидное

          <xsl:text>Catchup (Yes), &#10;SVOD (No)</xsl:text>

я получил

          <ss:Data ss:Type = "String">Catchup (Yes), 
SVOD (No)</ss:Data>

то есть это новая строка.


для других, смотрящих на этот вопрос, я не уверен на 100%, что это за вопрос, не говоря уже об ответе, и я попытаюсь уточнить.

кажется, что ответ michael.hor257k работает в некоторых контекстах. (так что на самом деле то, что я пытаюсь, работает в каком-то контексте)

<xsl:text disable-output-escaping = "yes">&amp;#10;</xsl:text>

это работает, если я жестко кодирую вывод и запускаю его в механизме XSLT, используемом VS2022.

он не работает против моей довольно "ванильной" реализации XSLT C# против XSLTTransform и XSLTCompiledTransform.

Мне также не ясно, работает ли он с настройкой VS2022 в моем производственном коде (который не просто жестко кодирует некоторый вывод, но выполняет гинастику appytemplate и nodeset).

Почему вы не можете просто жестко запрограммировать элемент Cell таким, какой он есть?

michael.hor257k 14.02.2023 16:32

я добавлю это к вопросу

MrD at KookerellaLtd 14.02.2023 16:34

tbh, я не хочу жестко кодировать выходную строку, я хочу разграничить набор узлов с помощью символов перевода строки

MrD at KookerellaLtd 14.02.2023 16:39

Я все еще не вижу проблемы. Символ &#10; — это символ LF. Неважно, как это представлено на выходе (и я сомневаюсь, что у вас есть контроль над тем, как это представлено с помощью процессора MS).

michael.hor257k 14.02.2023 16:44

нет &#10; представляет собой 6-символьное представление LF...LF - это LF...т.е. персонаж ЛФ. excel ожидает, что 6-символьное представление LF будет встроено в неразобранный xml.... оно будет игнорировать символ LF.

MrD at KookerellaLtd 14.02.2023 16:52

Я не знаю, что такое Эксель. В XML строка &#10; является точным эквивалентом символа LF, и соответствующий синтаксический анализатор будет анализировать их одинаково. В любом случае, ваш вопрос не о XSLT как таковом, а об управлении сериализацией результата преобразования. И ответ зависит от процессора.

michael.hor257k 14.02.2023 17:44

Я согласен с тем, что мой инстинкт заключается в том, что Excel использует какой-то нестандартный синтаксический анализ XML, и то, что я прошу, - это механизм для создания потенциально недопустимого XML, НО я надеялся, что CDATA был этим механизмом, но кажется, что в по крайней мере, с msxslt вы не можете форсировать сериализованные данные - tbh, я думаю, что это совершенно правильный вопрос. Я попробую в Саксонии, может быть.

MrD at KookerellaLtd 14.02.2023 17:53
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
7
53
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Если вы действительно готовы прибегнуть к использованию 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">&amp;#10;</xsl:text>
        <xsl:text>Bravo</xsl:text>
        <xsl:text disable-output-escaping = "yes">&amp;#10;</xsl:text>
        <xsl:text>Charlie</xsl:text>
    </Cell>
</xsl:template> 

</xsl:stylesheet>

Результат

<?xml version = "1.0"?>
<Cell>Alpha&#10;Bravo&#10;Charlie</Cell>

Однако это зависит от поддержки процессором disable-output-escaping. Судя по примерам в вашем вопросе, процессор, который вы используете, не работает. Вы говорите, что это движок Microsoft, но я получаю желаемый результат с обоими процессорами MS здесь: https://xsltfiddle.liberty-development.net/6qLZFRw

Также обратите внимание, что disable-output-escaping имеет значение только на этапе вывода. Если вы не пишете на выходе, это не имеет никакого эффекта.

как очень странно... Я запускаю это в визуальной студии (очевидно, снова на движке msxslt)... и... это работает! Я запускаю его в коде C# с движком msxslt, и это не так, он ведет себя как мой код в моем исходном примере.

MrD at KookerellaLtd 14.02.2023 23:13

Как я уже сказал, XSLT-процессор не требуется для поддержки disable-output-escaping. Возможно, в используемой вами конфигурации сериализация выполняется другим звеном в цепочке обработки.

michael.hor257k 14.02.2023 23:18

хотя это действительно странно..... я сериализую прямо в поток памяти из преобразования.

MrD at KookerellaLtd 14.02.2023 23:37

нет... происходит что-то еще, чего я не понимаю, ваш ответ ДЕЙСТВИТЕЛЬНО работает, учитывая мой простой пример, но он не работает в моем производственном коде... мне придется воспроизвести, я отмечу это как хотя ответь

MrD at KookerellaLtd 14.02.2023 23:56

интересно узнать, как код xsltfiddle настраивает свои преобразования, происходит что-то странное... Visual Studio соответствует xslt fiddle, но мой симпатичный ванильный код C# не работает, и этот ms engnie общеизвестно идиосинкразичен

MrD at KookerellaLtd 15.02.2023 00:28

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

MrD at KookerellaLtd 15.02.2023 17:34

Я добавил примечание по этому поводу. Я думаю, вы ошибаетесь, думая, что это версия (несмотря на "аберрацию" XSLT 1.1). Уж точно не с процессором MS.

michael.hor257k 15.02.2023 17:49

да, возможно, вы правы, хотя с моей реализацией происходит что-то странное

MrD at KookerellaLtd 15.02.2023 20:12

Это не ответ, а уточнение. Я считаю, что этот вопрос не имеет ничего общего с xslt , я добавил excel.

Как сказал michael.hor257k, две сериализации (&#10; и перевод строки) должны быть эквивалентны. Но когда я открываю следующий файл 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), &#10;FVOD (No), &#10;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, ни &#10; недостаточно для правильного восстановления исходных разрывов строк в ячейке. Интересно, что когда я вставляю разрывы строк вручную и экспортирую результат, значения разделяются LF.

michael.hor257k 15.02.2023 17:05

Разрывы строк в ячейках появляются, когда вы устанавливаете ячейки для «переноса текста». Но разница в Formula Bar остается.

Heiko Theißen 15.02.2023 17:05

см. ответ Майкла Кея на stackoverflow.com/questions/75460450/…. Вопрос действительно имеет отношение к XSLT, спецификации XSLT и механизмам XSLT, и для него, по крайней мере, хорошо известная проблема, если, возможно, не та, которая должна быть решаема на языке.

MrD at KookerellaLtd 15.02.2023 17:06

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

MrD at KookerellaLtd 15.02.2023 17:07

Я не понимаю, как здесь уместно «переносить текст»; Я ввел 3 значения, разделенные командой-возвратом. Обтекание текстом отключено для ячейки, но все 3 значения отображаются постоянно (вся строка имеет высоту 3 строки).

michael.hor257k 15.02.2023 17:12

С "переносом текста" это выглядит так: i.stack.imgur.com/UIIXj.png

Heiko Theißen 15.02.2023 17:16

@MrDatKookerellaLtd Проблема (представленная вами) решаема на языке XSLT; однако вы должны применять disable-output-escaping на этапе вывода, а не раньше, и вы должны использовать процессор, поддерживающий disable-output-escaping.

michael.hor257k 15.02.2023 17:16

@ michael.hor257k - на самом деле достаточно честно, просто это не работает для моего контекста, но вы правы.

MrD at KookerellaLtd 15.02.2023 17:20

Был дополнительный вопрос с помеченным ответом.

как получить новые строки «excel» в электронной таблице ML и поведение nodeset() при отключении выхода-экранирования (Saxon xslt 1.0)

Лучше всего читать это, резюме.

  • проблема, кажется, хорошо известна во время спецификации XSLT.
  • поведение "disable-output-escaping="yes"" меняется в спецификациях XSLT.
  • поведение вполне может меняться между механизмами XSLT одной и той же теоретической спецификации (для меня это, безусловно, происходит между разными механизмами/конфигурациями MSXSLT)
  • "Проблема решаема на языке XSLT, однако вы должны применить экранирование отключения вывода на этапе вывода, а не до него, и вы должны использовать процессор, поддерживающий экранирование отключения вывода" (комментарий michael.hor257k), для меня ограничение на «выходном каскаде» делает это правильное решение непригодным для моего конкретного использования, но оно правильное.

Надев шляпу Excel, я изменил реализацию, чтобы экспортировать несколько строк, а не пытаться поместить несколько строк в одну ячейку.

Другие вопросы по теме