powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Indentation to hierarchy
9 сообщений из 9, страница 1 из 1
Indentation to hierarchy
    #34320162
pavelblk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю, что проблема преобразования линейной структуры в иерархию довольная частая проблема.
Привожу яркий пример в параллель моему:
Трансформация WML во что-либо, где левый отступ параграфа задан аттрибутом.
В Worde это выглядит так:
-Text1
---Text2
-----Text3
---Text4
-Text5
---Text6

А надо получить вложенность этих элементов, такую как она выглядит графически в Ворде (или обусловлена схемой документа в формат которого вы трансформируете из Ворда или др.)

Вот примерный XML на выходе:

<para>text1
<para>text2
<para>text3</para>
</para>
<para>text4</para>
</para>
<para>text5
<para>text6</para>
</para>

Помогите решить подобную проблему, если у кого-то был подобный опыт.
...
Рейтинг: 0 / 0
Indentation to hierarchy
    #34326706
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pavelblkА надо получить вложенность этих элементов, такую как она выглядит графически в Вордеграфически???
...
Рейтинг: 0 / 0
Indentation to hierarchy
    #34326836
SuSa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Согласен с maXmo ,а нормального вывода в браузере типа IE где xml документ разносится в структурированный вид тебе уже нехватает.
Ты вообще чего там такое пишешь?
...
Рейтинг: 0 / 0
Indentation to hierarchy
    #34335811
pavelblk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я имею ввиду следующее:
Упрощенный вид WML (или любой другой XML):
<p indent="1">text1</p>
<p indent="2">text2</p>
<p indent="3">text3</p>
<p indent="2">text4</p>
<p indent="1">text5</p>
<p indent="2">text6</p>
<p indent="2">text7</p>
Выглядит это в Ворде как текст с различным отступом.

А необходимо получить:

<p indent="1">text1
<p indent="2">text2
<p indent="3">text3
</p>
<p indent="2">text4
</p>
</p>
</p>
<p indent="1">text5
<p indent="2">text6
</p>
<p indent="2">text7
</p>
</p>

Русским языком - это преобразование отступа или уровня (можно поразному определить этот аттрибут) в иерархию.
...
Рейтинг: 0 / 0
Indentation to hierarchy
    #34335858
pavelblk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaXmo, как то давно отвечал мне на этот вопрос, но решение было не полное.
Вот что мне написал MaXmo:

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

<xsl:template match="main">
<main>
<xsl:apply-templates select="para[@level='1']"/>
</main>
</xsl:template>

<xsl:template match="para">
<para1>
<xsl:value-of select="."/>
<xsl:if test="following-sibling::para[1]/@level > '1'">
<xsl:apply-templates select="following-sibling::para[1]" mode="insert"/>
</xsl:if>
</para1>
</xsl:template>

<xsl:template match="para" mode="insert">
<xsl:element name="{concat('para',@level)}">
<xsl:value-of select="."/>
<xsl:if test="following-sibling::para[1]/@level > '1'">
<xsl:apply-templates select="following-sibling::para[1]" mode="insert"/>
</xsl:if>
</xsl:element>
</xsl:template>

</xsl:stylesheet>

Да это работает, только не обрабатывает подряд идущие узлы с одинаковым уровнем.
И уж совсем не обрабатывает узлы при уменьшении уровня.
То есть:
1
2
3
2

C 3 на 2 не работает.

Я решил проблему обработки подряд идущих узлов с одинаковым уровнем.
Но при уменьшении уровня - никак.
...
Рейтинг: 0 / 0
Indentation to hierarchy
    #34336193
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
текущий уровень:
<xsl:variable name="curInd" select="number(@indent)"/>

придётся делать рекурсией. Типа так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<xsl:template name="show">
 <xsl:param name="curInd"/> <xsl:param name="pos"/> <xsl:param name="elem"/>
 <xsl:variable name="nextElem" select="$elem/following-sibling::p[$pos]"/>
 <xsl:if select="$nextElem and number($nextElem/@indent)&gt;$curInd">
  <xsl:if select="number($nextElem/@indent)=$curInd+1">
   <xsl:apply-templates select="$nextElem"/>
  </xsl:if>
  <xsl:call-template name="show"><!--для $pos+1--></xsl:call-template>  
 </xsl:if>
 <!--если ничего не делаем, рекурсия завершается-->
</xsl:template>
...
Рейтинг: 0 / 0
Indentation to hierarchy
    #34337587
pavelblk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего не понял, если не сложно можно показать в контексте?
Зачем нужен $nextElem?
...
Рейтинг: 0 / 0
Indentation to hierarchy
    #34338256
pavelblk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решил, но если в исходный документ добавить аттрибут id, который будет говорить о последовательности (порядок следования).
Знаю, что можно и без него, но как?
Подскажите!

Вот мое решение:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="nextposfirst">1</xsl:variable>

<xsl:template match="root">
<main>
<xsl:apply-templates select="step[@indent='1']"/>
</main>
</xsl:template>

<xsl:template match="step">
<xsl:element name="step">
<xsl:variable name="nextposfirst" select="number(following-sibling::step[@indent=1]/@id)"></xsl:variable>
<xsl:value-of select="."/>
<xsl:if test="number(following-sibling::step[@indent=1]/@id) > 1">
<xsl:apply-templates select="following-sibling::step[@indent - (current()/@indent)='1'][(@id < $nextposfirst)]"/>
</xsl:if>
<xsl:if test="not(following-sibling::step[@indent=1]/@id)">
<xsl:apply-templates select="following-sibling::step[@indent - (current()/@indent)='1']"/>
</xsl:if>
</xsl:element>
</xsl:template>

</xsl:stylesheet>
...
Рейтинг: 0 / 0
Indentation to hierarchy
    #34340283
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pavelblkНичего не понял, если не сложно можно показать в контексте?контекст ты задал. В каком месте не понятно?
pavelblkЗачем нужен $nextElem?для удобства
pavelblkЗнаю, что можно и без него, но как?как у меня, через позицию элемента.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Indentation to hierarchy
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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