Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Рекурсия вложенности в xslt / 9 сообщений из 9, страница 1 из 1
04.04.2007, 08:18
    #34435920
SuSa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсия вложенности в xslt
Всем доброго здравия.
У меня такая задачка.
Есть файлы 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
04.04.2007, 09:35
    #34436079
SuSa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсия вложенности в xslt
Забыл сказать. Если у вас возникнет мысль "а нафига надо так описывать xsl:include, ведь он в xsl работает", отвечаю это пример! , в реальном исполнении я описываю другой язык. Но та команда там выполняет теже функции что и include в xsl.
И еще написав данный пример, можно будет работать со всеми схожими ситуациями.
Это всё.

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


************************************************
<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
04.04.2007, 09:37
    #34436084
andrei77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсия вложенности в xslt
<xsl:call-template name="perenos">
вместо
<xsl:call-template name="rek">
конечно
...
Рейтинг: 0 / 0
04.04.2007, 10:56
    #34436431
SuSa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсия вложенности в xslt
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
04.04.2007, 12:30
    #34436950
andrei77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсия вложенности в xslt
автор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
04.04.2007, 15:08
    #34437712
SuSa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсия вложенности в xslt
ВСЁ!!!! сделал!
Код: 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
10.04.2007, 12:32
    #34449640
SuSa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсия вложенности в xslt
Переделанный более универсальный код
Код: 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
10.04.2007, 12:33
    #34449648
SuSa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсия вложенности в xslt
Мдя.... надо было другим цветом выделять :) Ну ладно, кому надо тот поймет
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Рекурсия вложенности в xslt / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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