powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Перенос по словам
11 сообщений из 11, страница 1 из 1
Перенос по словам
    #34341067
andrei77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
народ, переносил ли ктонибудь по словам строки...
например в одном элементе должно быть не больше 50 символов, все остальное в следующий элемент и т.д. если там снова больше 50 символов... ??
...
Рейтинг: 0 / 0
Перенос по словам
    #34341245
SuSa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тоесть допустим есть текчтовый блок, его надо разбить на строки длиной не более 50 символов?
...
Рейтинг: 0 / 0
Перенос по словам
    #34341367
andrei77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну да... вроде этого:

есть

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

<Object>Соль йодированая - <Object/>
<Object>В каждой крупинке<Object/>
<Object>сила Великого<Object/>
<Object>Джедая!<Object/>
...
Рейтинг: 0 / 0
Перенос по словам
    #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
Перенос по словам
    #34341692
andrei77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
substring-after
substring-before
(строка, символ)

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

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

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

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

то есть он будет слова обрезать. самое главное, то как перенести по словам, а не по символам
...
Рейтинг: 0 / 0
Перенос по словам
    #34343156
SuSa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотелось бы ответить, но че то написать некак не получается, а времени мало, так что могу токо посоветовать
1. Если ты смог написать фигню которая разбивает строку , на др. строки длиной по 20 символов и задача стоит лишь втом чтобы не разбивать слова , то напиши проверку , к примеру берешь значения 20 символа и сравниваешь его с пробелом, если нет, то циклом находишь ближайший на выводимом промежутке.
Описание функций возможных для обработки строк смотри в пространсве fn
соответсвенно ссылка http://www.w3.org/2005/xpath-functions/
токо учти что не все парсеры(точнее те кто основаны на xsl версии 1.0) их не потдерживают.
Напишешь покаж результат, Интересно чем дело закончится
...
Рейтинг: 0 / 0
Перенос по словам
    #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
Перенос по словам
    #34343809
andrei77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поэтому теперь думаю как бы его переделать чтобы он сработал для нескольких <object>

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

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

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

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


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