Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Перенос по словам / 11 сообщений из 11, страница 1 из 1
19.02.2007, 14:36
    #34341067
andrei77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос по словам
народ, переносил ли ктонибудь по словам строки...
например в одном элементе должно быть не больше 50 символов, все остальное в следующий элемент и т.д. если там снова больше 50 символов... ??
...
Рейтинг: 0 / 0
19.02.2007, 15:18
    #34341245
SuSa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос по словам
Тоесть допустим есть текчтовый блок, его надо разбить на строки длиной не более 50 символов?
...
Рейтинг: 0 / 0
19.02.2007, 15:41
    #34341367
andrei77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос по словам
ну да... вроде этого:

есть

<Object>Соль йодированая - В каждой крупинке сила Великого Джедая!<Object/>
и если например взять чтобы в строчке не больше 20 симвовлов было тогда результат преобразования по идее должен выглядить следующим образом:

<Object>Соль йодированая - <Object/>
<Object>В каждой крупинке<Object/>
<Object>сила Великого<Object/>
<Object>Джедая!<Object/>
...
Рейтинг: 0 / 0
19.02.2007, 15:51
    #34341422
SuSa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос по словам
:D Убил !!! Жешшь
Примерно так:
<xsl:template match="//Object">
<xsl:choose>
<xsl:when test="string-length(text()) < 20">
<xsl:element name="Object">
<xsl:value-of select="text()"/>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:element name="Object">
а вот сдесь нужна функция которая либо будет вытаскивать кусками, либо затирать эти куски в основной строке по мере вытаскивания, посмотри функцию substring, вроде она
...
</xsl:element>
<xsl:text>
</xsl:text>
</xsl:otherwise>
</xsl:choose>

</xsl:template>
...
Рейтинг: 0 / 0
19.02.2007, 16:48
    #34341692
andrei77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос по словам
substring-after
substring-before
(строка, символ)

первая выдает строку после определеного символа, вторая до...

ну вот если я сделаю substring-before(text(), ' ') то он выдаст "Соль"
если substring-after(text(), ' ') то "йодированая - В каждой крупинке сила Великого Джедая!"
можно конкатом сделать вот так:
concat(substring-before(text(), ' '), substring-before(substring-after(text(), ' '), ' '))
тогда будет
Соль йодированная, но опять я не знаю сколько символов здесь... не понятно по какому критерию эти слова переносить или оставлять, опять нужно подсчитывать символы и мне так кажется нужно это делать циклом, читай рекурсией... ???
...
Рейтинг: 0 / 0
20.02.2007, 10:30
    #34343009
andrei77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос по словам
да есть ещё substring(строка, начало позиции, кол-во символов)

и если написать что-то вроде
substring-before(text(),1,20) и продолжать так делить то получится

Соль йодированая - В
каждой крупинке сил
а Великого Джедая!

то есть он будет слова обрезать. самое главное, то как перенести по словам, а не по символам
...
Рейтинг: 0 / 0
20.02.2007, 11:10
    #34343156
SuSa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос по словам
Хотелось бы ответить, но че то написать некак не получается, а времени мало, так что могу токо посоветовать
1. Если ты смог написать фигню которая разбивает строку , на др. строки длиной по 20 символов и задача стоит лишь втом чтобы не разбивать слова , то напиши проверку , к примеру берешь значения 20 символа и сравниваешь его с пробелом, если нет, то циклом находишь ближайший на выводимом промежутке.
Описание функций возможных для обработки строк смотри в пространсве fn
соответсвенно ссылка http://www.w3.org/2005/xpath-functions/
токо учти что не все парсеры(точнее те кто основаны на xsl версии 1.0) их не потдерживают.
Напишешь покаж результат, Интересно чем дело закончится
...
Рейтинг: 0 / 0
20.02.2007, 13:07
    #34343628
andrei77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос по словам
XSLT<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/root">
<root>
<xsl:call-template name="format">
<xsl:with-param select="normalize-space(Object)" name="txt" />
<xsl:with-param name="width">20</xsl:with-param>
</xsl:call-template>
</root>
</xsl:template>

<xsl:template name="format">
<xsl:param name="txt" />
<xsl:param name="width" />

<xsl:if test="$txt">
<xsl:variable name="real-width">
<xsl:call-template name="tune-width">
<xsl:with-param select="$txt" name="txt" />
<xsl:with-param select="$width" name="width" />
<xsl:with-param select="$width" name="def" />
</xsl:call-template>
</xsl:variable>

<Object><xsl:value-of select="substring($txt, 1, $real-width)" /></Object>

<xsl:call-template name="format">
<xsl:with-param select="substring($txt,$real-width+1)" name="txt" />
<xsl:with-param select="$width" name="width" />
</xsl:call-template>

</xsl:if>
</xsl:template>


<xsl:template name="tune-width">
<xsl:param name="txt" />
<xsl:param name="width" />
<xsl:param name="def" />

<xsl:choose>
<xsl:when test="$width = 0">
<xsl:value-of select="$def" />
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="substring($txt, $width, 1 ) = ' '">
<xsl:value-of select="$width" />
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="tune-width">
<xsl:with-param select="$txt" name="txt" />
<xsl:with-param select="$width - 1" name="width" />
<xsl:with-param select="$def" name="def" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:template>

</xsl:stylesheet>

Input:<?xml version="1.0" encoding="UTF-16"?>
<root>
<Object>Соль йодированая - В каждой крупинке сила Великого Джедая!</Object>
</root>


Output:<?xml version="1.0" encoding="UTF-16"?>
<root>
<Object>Соль йодированая - </Object>
<Object>В каждой крупинке </Object>
<Object>сила Великого </Object>
<Object>Джедая!</Object>
</root>


Кстати к разговору в соседней ветке о FAQ

Это преобразование было написано не мной, а было найдено в одном из англоязычных FAQ
и тут я конечно чувствую себя двойственно

с одной стороны я решил проблему - быстро
с другой- мало, что сделал для этого преобразования в плане опыта своего, потомучто все таки еслибы я написал его сам, то это было быгораздо эффективней для дальнейшей моей работы.

и вот ещё ...
к вопросу о филисофии XSLT:

Небезисзвестный нам Алексей ВаликовQ: как ограничить длину всех строк в тексте "максимум 80 символов"?

A: Ох, непросто. Не тем концом отвертки гвозди забиваете. Можно написать рекурсивный шаблон, которому передаются два параметра: текущая длина строки и остаток строки. Шаблон берет первый токен остатка строки, отделенный пробелами, складывает его длину с текущей длиной строки плюс один и сравнивает с 80. Если больше, то выводит
, и вызывает сам себя с текущей длиной строки равной 0 и тем же остатком строки. Если меньше, то выводит пробел, затем первый токен остатка строки и вызывает себя с новой текущей длиной строки равной старой текущей длине строки плюс длина первого токена текущего остатка строки плюс единица и с новым остатком строки равным части старого текущего остатка после пробела после первого токена старого текущего остатка строки.

Однако, как очевидно из вышесказанного, это есть извращение. Легче написать либо расширение, либо простенький фильтр.

XSLT слабо подходит для форматирования текста.

-- Aleksei Valikov в fido7.ru.xml
...
Рейтинг: 0 / 0
20.02.2007, 13:49
    #34343809
andrei77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос по словам
поэтому теперь думаю как бы его переделать чтобы он сработал для нескольких <object>

типа
<root>
<Object>Это что за боровик шустро влез на броневик?</Object>
<Object>Лежит на спине - никому не нужна. Прислони к стене - пригодится она.<Object>
<Object>Кстати загадки из детского журанала мурзилка </Object>
</root>
...
Рейтинг: 0 / 0
20.02.2007, 15:28
    #34344252
andrei77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос по словам
гад, все время практически последнее слова перекидывает на следующую строчку
...
Рейтинг: 0 / 0
20.02.2007, 17:07
    #34344706
andrei77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перенос по словам
Если кто будет пользовать надо ещё в шаблон

<xsl:template name="tune-width">

вставить такое условие на томже уровне что и проврека $width с нулем, чтобы если в строке ДВА слова последних остались он их не дробил на две категории

<xsl:when test="string-length($txt) < $width">
<xsl:value-of select="$def" />
</xsl:when>
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Перенос по словам / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]