XSLT - вывод в html определенного XML-элемента, который содержит форматированный текст - вывод должен быть таким же - PullRequest
2 голосов
/ 21 июля 2011

У меня есть элемент xml, который содержит данные форматированного текста:

   <MESSAGE>
      <TranslationReport>
Translation Report
==================
Contains errors ? true
Contains warnings ? false
There are 9 entries in the report

Я хочу, чтобы результаты моего xslt (вывод в html) точно соответствовали содержанию TranslationReport. Все, что я делаю, просто берет данные (все в одну строку - см. Ниже). Это кажется легким, но я искал во всех своих книгах и везде ...

Отчет о переводе ================== Содержит ошибки? правда содержит предупреждения? false В отчете 9 записей

Ответы [ 3 ]

1 голос
/ 21 июля 2011

Вы пытались использовать тег <xsl:output method="text"/> и / или заключать буквенный текст в теги <xsl:text>...</xsl:text> ?

Если вы отображаете результаты в HTMLпроблема в том, что HTML не отображает символы новой строки, не заключая вывод в тег , такой как <pre>.Выведите тег <pre>, заключающий текстовый вывод в ваш XSLT.

0 голосов
/ 22 июля 2011

Если вы собираетесь рендерить в html, у вас есть два варианта:

  • используйте тег pre для отображения текста в браузере точно так же, как есть.
  • анализирует ваш текст с помощью некоторой расширенной функции XPath 2.0 и обрабатывает каждую текстовую строку по мере необходимости

Вот первый вариант глупого примера:

<code><xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="html"/>

    <xsl:template match="MESSAGE/TranslationReport">
        <html>
            <body>
                <pre>
                    <xsl:value-of select="."/>
                
</ XSL: шаблон> </ XSL: таблицы стилей>

Во втором варианте мы проанализируем ваш текст с помощью функции XPath 2.0 tokenize, разделив все строки и обернув каждую из них тегом eanted.

Это глупый пример:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="html"/>

    <xsl:template match="MESSAGE/TranslationReport">
        <html>
            <body>
                <xsl:for-each select="tokenize(.,'\n')
                    [not(position()=(1,last()))]">
                    <p class="TranslationReport">
                        <xsl:value-of select=".[position()]"/>
                    </p>
                </xsl:for-each>
            </body>
        </html>
    </xsl:template>

</xsl:stylesheet>

Во втором случае вывод будет:

<html>
    <body>
        <p class="TranslationReport">Translation Report</p>
        <p class="TranslationReport">==================</p>
        <p class="TranslationReport">Contains errors ? true</p>
        <p class="TranslationReport">Contains warnings ? false</p>
        <p class="TranslationReport">There are 9 entries in the report</p>
    </body>
</html>
0 голосов
/ 22 июля 2011

Проблема, с которой вы сталкиваетесь, может быть связана с тем фактом, что в XML различные формы пробелов (разрывы строк, пробелы и т. Д.) Считаются эквивалентными. Смотрите этот ответ: Является ли "плохой практикой" быть чувствительным к разрывам строк в документах XML?

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