|
|
|
Рекурсия вложенности в xslt
|
|||
|---|---|---|---|
|
#18+
Всем доброго здравия. У меня такая задачка. Есть файлы 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2007, 08:18 |
|
||
|
Рекурсия вложенности в xslt
|
|||
|---|---|---|---|
|
#18+
Забыл сказать. Если у вас возникнет мысль "а нафига надо так описывать xsl:include, ведь он в xsl работает", отвечаю это пример! , в реальном исполнении я описываю другой язык. Но та команда там выполняет теже функции что и include в xsl. И еще написав данный пример, можно будет работать со всеми схожими ситуациями. Это всё. З.Ы. Жду ответов. За ранее спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2007, 09:35 |
|
||
|
Рекурсия вложенности в xslt
|
|||
|---|---|---|---|
|
#18+
Например вот так: ************************************************ <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> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2007, 09:36 |
|
||
|
Рекурсия вложенности в xslt
|
|||
|---|---|---|---|
|
#18+
<xsl:call-template name="perenos"> вместо <xsl:call-template name="rek"> конечно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2007, 09:37 |
|
||
|
Рекурсия вложенности в xslt
|
|||
|---|---|---|---|
|
#18+
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. когда аська заработает?!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2007, 10:56 |
|
||
|
Рекурсия вложенности в xslt
|
|||
|---|---|---|---|
|
#18+
автор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"/> то он все время будет передавать один и тот же параметр, зачем???? Аська не работает ... а у тебя что работает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2007, 12:30 |
|
||
|
Рекурсия вложенности в xslt
|
|||
|---|---|---|---|
|
#18+
ВСЁ!!!! сделал! Код: 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:include, но до это я думаю и сам дойду. Еще раз огромное спасибо. ЗЫ. Аська хоть и работает, сообщения недохдят даже до соседнего компа (проверил). Что за день сегодня такой? ЗЫЫ. С праздником всех веб-дизайнеров (сказали по радио. Может наврали? :) ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2007, 15:08 |
|
||
|
Рекурсия вложенности в xslt
|
|||
|---|---|---|---|
|
#18+
Переделанный более универсальный код Код: 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. З.Ы. Красным пометил те места которые надо будет редактировать под конкретный синтаксис другого языка ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2007, 12:32 |
|
||
|
|

start [/forum/topic.php?fid=14&msg=34436079&tid=1334357]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
169ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 203ms |
| total: | 474ms |

| 0 / 0 |
