powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Рекурсия вложенности в xslt
9 сообщений из 9, страница 1 из 1
Рекурсия вложенности в xslt
    #34435920
SuSa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго здравия.
У меня такая задачка.
Есть файлы 1.xsl, 2.xsl, 3.xsl. к примеру. Своим xsl файлом я парсю 1.xsl. Копирую в нем все строки если они отличны от строки xsl:include. Как токо натыкаюсь на эту строку, захожу в тот на который он ссылается (2.xsl), и начинаю копировать его содержимое (все, кроме xsl:stylesheet), как закончил возращаюсь в 1.xsl - и копирую остатки. Эта часть разработана, и работает.
У меня собственно проблема в следующем. как организовать рекурсию уходящую в глубь.
Т.е. 1.xsl -> if (xsl:include)=true -> 2.xsl -> if (xsl:include)=true -> 3.xsl ->if (xsl:include)=false- копировать концы предыдущих документов и выход.
Подскажите как это можно организовать.
Предложения типа сначало обработать 1.xsl и 2.xsl, а потом смотреть нет ли в результате xsl:include не подходит. Иначе бы и вопроса небыло.

Код того что уже сделал
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
 <xsl:template match="/">
- <xsl:copy>
  <xsl:apply-templates select="node()|@*" /> 
  </xsl:copy>
  </xsl:template>
- <xsl:template match="node()|@*">
- <xsl:choose>
- <xsl:when test="name()!='xsl:include'">
- <xsl:copy>
  <xsl:apply-templates select="node()|@*" /> 
  </xsl:copy>
  </xsl:when>
- <xsl:otherwise>
- <xsl:comment>  скопировано из   <xsl:value-of select="//xsl:include/@href" />   от сюда   </xsl:comment>
<!-- <xsl:if test="name(document(//xsl:include/@href)/xsl:stylesheet/*)!='xsl:include'">-->
  <xsl:copy-of select="document(//xsl:include/@href)/xsl:stylesheet/*" /> 
<!--  </xsl:if>-->
  <xsl:text></xsl:text> 
  <xsl:comment>скопировано и до сюда</xsl:comment> 
  </xsl:otherwise>
  </xsl:choose>
  </xsl:template>
...
Рейтинг: 0 / 0
Рекурсия вложенности в xslt
    #34436079
SuSa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл сказать. Если у вас возникнет мысль "а нафига надо так описывать xsl:include, ведь он в xsl работает", отвечаю это пример! , в реальном исполнении я описываю другой язык. Но та команда там выполняет теже функции что и include в xsl.
И еще написав данный пример, можно будет работать со всеми схожими ситуациями.
Это всё.

З.Ы. Жду ответов. За ранее спасибо
...
Рейтинг: 0 / 0
Рекурсия вложенности в xslt
    #34436080
andrei77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например вот так:


************************************************
<xsl:call-template name="rek">
<xsl:with-param name="n" select="1"></xsl:with-param>
</xsl:call-template>


***********************************************

<xsl:template name="rek">
<xsl:param name="n"/>

<xsl:if test="name(document(concat($n,'.xsl'))/xsl:stylesheet/*)!='xsl:include' "> <!-- твое же условие, короче тут нужно выходить из цикла -->
<xsl:copy-of select="document(concat($n,'.xsl'))/xsl:stylesheet/*" />
<xsl:call-template name="perenos">
<xsl:with-param name="n" select="$n +1"></xsl:with-param>
</xsl:call-template>


</xsl:if>

</xsl:template>
...
Рейтинг: 0 / 0
Рекурсия вложенности в xslt
    #34436084
andrei77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
<xsl:call-template name="perenos">
вместо
<xsl:call-template name="rek">
конечно
...
Рейтинг: 0 / 0
Рекурсия вложенности в xslt
    #34436431
SuSa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
name(document(concat($n,'.xsl'))/xsl:stylesheet/*)!='xsl:include'
Он node() не перебирает, он их сразу все берет. Если первым тегом после xsl:stylesheet будет xsl:include бесконечный цикл гарантирован с таким кодом
<xsl:template name="rek">
<xsl:param name="n"/>
<xsl:choose>
<xsl:when test="name(document($n)/xsl:stylesheet/*)!='xsl:include' ">
<xsl:copy-of select="document($n)/xsl:stylesheet/*" />
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="rek">
<xsl:with-param name="n" select="//xsl:include/@href"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>

</xsl:template>
P.S. когда аська заработает?!!!
...
Рейтинг: 0 / 0
Рекурсия вложенности в xslt
    #34436950
andrei77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторname(document(concat($n,'.xsl'))/xsl:stylesheet/*)!='xsl:include'
Он node() не перебирает, он их сразу все берет. Если первым тегом после xsl:stylesheet будет xsl:include бесконечный цикл гарантирован с таким кодом
<xsl:template name="rek">
<xsl:param name="n"/>
<xsl:choose>
<xsl:when test="name(document($n)/xsl:stylesheet/*)!='xsl:include' ">
<xsl:copy-of select="document($n)/xsl:stylesheet/*" />
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="rek">
<xsl:with-param name="n" select="//xsl:include/@href"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>

</xsl:template>
P.S. когда аська заработает?!!!

И не должен перебирать
напиши какойнибудь другой выход...если твой не работает
например
<xsl:if test="document(concat($n,'.xsl'))/xsl:stylesheet/xsl:include">
то есть если не будет никакого инклуда и перебирать тогда нечего... выйдет

то что ты написал я не понял, если сделать:
<xsl:with-param name="n" select="//xsl:include/@href"/>
то он все время будет передавать один и тот же параметр, зачем????

Аська не работает ... а у тебя что работает?
...
Рейтинг: 0 / 0
Рекурсия вложенности в xslt
    #34437712
SuSa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВСЁ!!!! сделал!
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
    <xsl:template match="/">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="node()|@*">
        <xsl:choose>
            <xsl:when test="name()!='xsl:include'">
                <xsl:copy>
                    <xsl:apply-templates select="node()|@*"/>
                </xsl:copy>
            </xsl:when>
            <xsl:otherwise>
                <xsl:comment>скопировано  от сюда</xsl:comment>
                <xsl:call-template name="rek">
                    <xsl:with-param name="n" select="2"/>
                </xsl:call-template>
                <xsl:text>
</xsl:text>
                <xsl:comment>скопировано и до сюда</xsl:comment>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template name="rek">
        <xsl:param name="n"/>
        <xsl:choose>
            <xsl:when test="not(document(concat($n,'.xsl'))/xsl:stylesheet/xsl:include)">
                <xsl:copy-of select="document(concat($n,'.xsl'))/xsl:stylesheet/*" /> 
            </xsl:when>
            <xsl:otherwise>
                <xsl:call-template name="rek">
                    <xsl:with-param name="n" select="$n +1"></xsl:with-param>
                </xsl:call-template>
            </xsl:otherwise>
        </xsl:choose>
        <xsl:copy-of select="document(concat($n,'.xsl'))/xsl:stylesheet/*" /> 
    </xsl:template>
Огромное спасибо andrei77 за моральную поддержку и поддержку кодом! Токо благодаря твоим подсказкам это дело приблизилось к логическому концу!
Осталась небольшая задачка как не выводить в общем скопе кода строки xsl:include, но до это я думаю и сам дойду.
Еще раз огромное спасибо.
ЗЫ. Аська хоть и работает, сообщения недохдят даже до соседнего компа (проверил). Что за день сегодня такой?
ЗЫЫ. С праздником всех веб-дизайнеров (сказали по радио. Может наврали? :) )
...
Рейтинг: 0 / 0
Рекурсия вложенности в xslt
    #34449640
SuSa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переделанный более универсальный код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
    <xsl:template match="/">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="node()|@*">
        
        <xsl:choose>
            <xsl:when test="name()!='[color=red]xsl:include[/color]'">
                <xsl:copy>
                    <xsl:apply-templates select="node()|@*"/>
                </xsl:copy>
            </xsl:when>
            <xsl:otherwise>
               <xsl:call-template name="rek">
                    <xsl:with-param name="new" select="[color=red]//xsl:include[/color]/@href"/>
                </xsl:call-template>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template name="rek">
        <xsl:param name="new"/>
        <xsl:choose>
            <xsl:when test="document($new)/[color=red]xsl:stylesheet/xsl:include[/color]">
                <xsl:call-template name="rek">
                    <xsl:with-param name="new" select="document($new)/[color=red]xsl:stylesheet/xsl:include[/color]/@href"/>
                </xsl:call-template>
            </xsl:when>
        </xsl:choose>
        <xsl:text>
</xsl:text>
        <xsl:comment>Замена include скопировано  от сюда (файл <xsl:value-of select="$new"/>)</xsl:comment>
        <xsl:text>
</xsl:text>
        <xsl:copy-of select="document($new)/[color=red]xsl:stylesheet[/color]/*[name(.)!='[color=red]xsl:include[/color]']"/>
        <xsl:text>
</xsl:text>
        <xsl:comment>скопировано и до сюда</xsl:comment>
    </xsl:template>
Теперь им можно гнать любые include или другие команды с тем же смыслом не зависимо от языка :). Надо будет токо немного подкорректировать код под конкретный язык
З.Ы. Красным пометил те места которые надо будет редактировать под конкретный синтаксис другого языка
...
Рейтинг: 0 / 0
Рекурсия вложенности в xslt
    #34449648
SuSa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мдя.... надо было другим цветом выделять :) Ну ладно, кому надо тот поймет
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Рекурсия вложенности в xslt
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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