Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > XML, XSL > Как отменить в xsl:copy-of вставку переходов строк


Автор: Rino 23.9.2008, 17:44
есть код
Код

<xsl:for-each select="images/image" >
                <xsl:if test="(position() mod 2 = 1)">
                    <div class="contentGallery">
                            <img src="/images/line.jpg" class="picLine"/>
                            <a href="javascript:void(0);" OnClick="javascript:ChangeContent('{imagesPath}', {imagesOrder})" ><img src="/images/small/{imagesPath}" class="feedBack" /></a>
                            <script>contentM[<xsl:value-of select="imagesOrder" />]='<xsl:copy-of select="text" />';
                            </script>                                
                            <div class="titleText">
                                <xsl:copy-of select="imagesTitleRu" />
                                
                            </div>
                    </div>
</xsl:if>

строчка contentM[<xsl:value-of select="imagesOrder" />]='<xsl:copy-of select="text" />' кладет html текст в переменную яваскрипта.
возникает проблема с переносом строк. (xsl форматирует код и вставляет переносы).
например таблица выводится вот в таком виде
contentM[1]='<text><table><tbody>
<tr>
<td>Демонтаж старой электропроводки</td>
<td>35 руб.</td>
<td>шт</td>
</tr>
<tr>
<td>монтаж и подключение автомата</td>
<td>400 руб.</td>
<td>шт</td>
</tr>
<tr>
<td>Монтаж и подключение входного звонка</td>
<td>500 руб.</td>
<td>шт</td>
</tr>
<tr>
<td>Монтаж и подключение кассетного светильника и бра</td>
<td>500 руб.</td>
<td>шт</td>
</tr>
<tr>
<td>Монтаж и подключение люстры</td>
<td>700 руб.</td>
<td>шт</td>
</tr>
<tr>
<td>Монтаж и подключение электроточки</td>
<td>300 руб.</td>
<td>шт</td>
</tr>
<tr>
<td>Монтаж кабель-каналов</td>
<td>90 руб.</td>
<td>м2</td>
</tr>
<tr>
<td>Монтаж канального вентилятора</td>
<td>500 руб.</td>
<td>шт</td>
</tr>
</tbody></table></text>';

т.е. из-за переноса строк получается проблема с содержанием переменной.

Вопрос - как заставить xsl не вставлять перенос строк? Пробовал использовать CDATA, но не получилось.
Подскажите, горит.

Автор: jsa 24.9.2008, 06:26
Цитата(Rino @  23.9.2008,  22:44 Найти цитируемый пост)
<script>contentM[<xsl:value-of select="imagesOrder" />]='<xsl:copy-of select="text" />';

Код

<xsl:text>
<script>contentM[<xsl:value-of select="imagesOrder" />]='<xsl:copy-of select="text" />';
</xsl:text>

попробуй
или даже так
Код

script>contentM[<xsl:value-of select="imagesOrder" />]='<xsl:text><xsl:copy-of select="text" /></xsl:text>';


Добавлено @ 06:36
можно еще посмотреть в сторону <xsl:strip-space>

Автор: Rino 24.9.2008, 10:50
пока нашел такой выход:
<script>contentM[<xsl:value-of select="imagesOrder" />]='<xsl:value-of select="normalize-space(text)" />';</script>

При этом главное оберунуть text в <![CDATA[какой то текст, с тегами, пробелами и переходами строк]]> но делаю это на уровне xml,
не очень удобно. 
Может все таки кто-нить подскажет еще какой-нить вариант.

Автор: jsa 24.9.2008, 12:03
<xsl:strip-space> не подходит?

Автор: Bulat 24.9.2008, 12:47
Rino, вместо <xsl:copy-of select="."/>, попробуй <xsl:apply-templates select="."/>. Может поможет smile

Автор: Rino 24.9.2008, 15:52
Bulat, <xsl:apply-templates select="text"/> используя с <![CDATA[какой то текст, с тегами, пробелами и переходами строк]]> переносит строки, без сдата - режит html теги.

jsa,  <xsl:strip-space>  пробовал, но что не помогло.

Задача была не только убрать переводы строк но и сохранить HTML.

Автор: Bulat 24.9.2008, 17:05
Давай с самого начала, зачем ты в яваскрипт кидаешь html-текст?? Мне кажется, что все можно сделать проще smile

Автор: Rino 24.9.2008, 17:22
Bulat, да это не я его туда кидаю. Человек не смог решить эту проблему, попросил помочь, я вроде бы нашел решение.
Это для галерии делается, там меняется текст и картинка.
посмотри вот здесь http://santehmaster.ru/service/repair/

Автор: Bulat 24.9.2008, 17:35
Rino, дело в том, что 

Цитата(Rino @  24.9.2008,  15:52 Найти цитируемый пост)
Задача была не только убрать переводы строк


Данные задачи не решаются на уровне xslt. XSLT - это лишь шаблоны для разметки. Максимум, можно что-то скрыть/показать из того, что у нас выходе. smile Возможно, конечно, если покопатся, то в js это можно сделать, но в нем я не так силен smile

Автор: Cycle 24.9.2008, 21:36
Rino, сформулируй пожалуйста, что именно тебе надо. Потому что сам по себе xsl:copy-of данные не переформатирует.
Вот тестировал в msxsl:

Исходный xml-файл
Код

<?xml version='1.0'?>
<text>
    <table>
        <tr><td>11</td><td>12</td></tr>
        <tr><td>21</td><td>22</td></tr>
    </table>
</text>


xsl-схема
Код

<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <xsl:copy-of select="text"/>
    </xsl:template>
</xsl:stylesheet>


результат
Код

<?xml version="1.0" encoding="UTF-16"?><text>
    <table>
        <tr><td>11</td><td>12</td></tr>
        <tr><td>21</td><td>22</td></tr>
    </table>
</text>


Как видешь, лишние переносы строк не появились. Может тебе лечше попробовать переделать свой код без скрипта?

Автор: Bulat 25.9.2008, 10:28
Cycle, Скорее всего твой вариант отличается тем, что у тебя изначально в коде нет переноса строк(символов табуляции). XSLT - не может урезать символы табуляции, насколько мне известно. smile

Автор: Rino 25.9.2008, 11:16
Ребят у меня в тексте, который вставляет copy-of не было никаких переносов, он был вытянут в строчку!
после вставки, он появлялся в коду страницы в отформатированном виде.
и все бы хорошо, но мне надо было запихнуть его в СТРОКУ, т.е. обрамить кавычками с двух сторон.
соотвественно один переход строки и кавычки обрывались. яваскрипт ругался на незаконченную строку.

вот.

Автор: jsa 25.9.2008, 12:45
а можно сделать 
Код

<xsl:output indent="no" />

и будет тебе счастье

Автор: Bulat 25.9.2008, 12:46
Rino, раз уж есть js, можно работать с регулярными выражениями. берешь свой текст и проверяешь на /\n/. Если есть хоть один символ переноса строки, значит есть. Заодно, можно проверить где именно появляются переносы строк, если появляются smile

Автор: Rino 25.9.2008, 14:47
Bulat, а смысл обрабатывать это скриптами? 

Автор: Bulat 25.9.2008, 15:00
Rino, Вообще-то хорошо было бы удостоверится, что переносы строк появляются именно на этапе обработки xslt. Лично я с этим не сталкивался, и не получилось у себя с имитировать. Если переносы строк, все же появляются действительно из-за форматирования xsl - будем знать, а если нет, то боюсь нужно искать корень проблемы, а не вешать просто заплатку smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)