Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Проблема с рекурсией в XSL / 25 сообщений из 25, страница 1 из 1
08.03.2006, 13:23
    #33588087
Mr.Zlatko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с рекурсией в XSL
<xsl:template match="item">
,['<xsl:value-of select="@name"/>'
<xsl:apply-templates select="item"/>
]
</xsl:template>


Вот собственно рекурсия..мне нужно при первом визове етого шаблона не печатать
перед именем елемента символ ",".
Как вийти из такой ситуации?
...
Рейтинг: 0 / 0
08.03.2006, 13:46
    #33588106
Молчун82
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с рекурсией в XSL
Mr.Zlatko
<xsl:template match="item">
,['<xsl:value-of select="@name"/>'
<xsl:apply-templates select="item"/>
]
</xsl:template>


Вот собственно рекурсия..мне нужно при первом визове етого шаблона не печатать
перед именем елемента символ ",".
Как вийти из такой ситуации?

Сделать отдельный шаблон для первого вызова, без ",".
Если не подходит напиши почему.
...
Рейтинг: 0 / 0
08.03.2006, 19:33
    #33588360
B0rG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с рекурсией в XSL
другой вариант - добавить параметр (уровень рекурсии например)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<xsl:template match="item"> 
    <xsl:param name="p"> 0 </xsl:param>

<xsl:if test="$p > 0">,</xsl:if>['<xsl:value-of select="@name"/>'
<xsl:apply-templates select="item" > 
    <xsl:with-param name="p">number($p) +  1 </xsl:with-param>
</xsl:apply-templates>
] 
</xsl:template>



Cheers
Pete
...
Рейтинг: 0 / 0
09.03.2006, 12:37
    #33589410
Mr.Zlatko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с рекурсией в XSL
Код:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<xsl:template match="item">
		<xsl:param name="level">0</xsl:param>
		<xsl:if test="$level > 0">
		,
		</xsl:if>				
		
		['<xsl:value-of select="@name"/>'
		<xsl:apply-templates select="item" > 
		<xsl:with-param name="level">number($level) + 1</xsl:with-param>
		</xsl:apply-templates>	
		]
    </xsl:template>


почему то в if никогда не попадает....
...
Рейтинг: 0 / 0
09.03.2006, 17:16
    #33590608
B0rG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с рекурсией в XSL
ну я поторопился немного

<xsl:with-param name="level" select="number($level) + 1" />
...
Рейтинг: 0 / 0
09.03.2006, 17:37
    #33590674
Молчун82
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с рекурсией в XSL
Не надо вводить уровней рекурсии. Вот так будет проще:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<xsl:template match="item1"> 
['<xsl:value-of select="@name"/>'
<xsl:apply-templates select="item"/> 
] 
</xsl:template>

<xsl:template match="item"> 
,['<xsl:value-of select="@name"/>'
<xsl:apply-templates select="item"/> 
] 
</xsl:template>
...
Рейтинг: 0 / 0
09.03.2006, 17:43
    #33590704
Mr.Zlatko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с рекурсией в XSL
да спасибо заработало...и еще напоследок подскажы пожайлуйста как мне выводить в хтмл результат number($level)
...
Рейтинг: 0 / 0
09.03.2006, 19:08
    #33590951
B0rG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с рекурсией в XSL
Молчун82Не надо вводить уровней рекурсии. Вот так будет проще:


Гыыы... два раза и оба не правильно.
Надо тогда через мод делать (apply-templates select="..." mode=".." )

2 Mr.Zlatko

так и выводить
<xsl:value-of select="number($level)" />
...
Рейтинг: 0 / 0
10.03.2006, 12:33
    #33592366
Mr.Zlatko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с рекурсией в XSL
Господа а можна ли каким то простым способом узнать что ето последний уровень рекурсии?
...
Рейтинг: 0 / 0
10.03.2006, 13:06
    #33592516
B0rG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с рекурсией в XSL
<xsl:if test="position() = last()" > ...

только мне начинает казаться, что вы там что то не то пытаетесь сделать...

опишите ка задачу с самого начала, с примерами xml и xsl...

Cheers
Pete
...
Рейтинг: 0 / 0
10.03.2006, 13:20
    #33592585
Mr.Zlatko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с рекурсией в XSL
Мой хмл файлик опысывает меню реализованое в жаваскрипт.Хсл должен сформировать многовымерный масив.


<menu name="MHATAdmin">
<item name="File">
<item name="New">
<item name="New1" handler="OnNew1">
</item>
</item>
<item name="Open">
<item name="Open1" handler="OnOpen1">
</item>
</item>
</item>
</menu>


Атрибут handler может быть только у последнего елеметна менюшки, вот собственно поетому я и спросил как узнать последний ли ето уровень рекурсии.
А предыдущий мой вопрос про вывод числа ..был просто для самоусовершенсвования..
...
Рейтинг: 0 / 0
10.03.2006, 13:39
    #33592659
B0rG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с рекурсией в XSL
Вам рекурсия вообще не нужна - Молчун был прав, конечно, только вот сказать не успел :)

задача с запятыми в списке стандартная и решается вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
<!-- там где надо -->
<xsl:apply-templates select="item" />
...
<xsl:template match="item"> 
	['<xsl:value-of select="@name"/>'] 
	<xsl:if test="not( position() = last() )">,</xsl:if>
</xsl:template>

для менюхи чуть посложнее но тоже самое.

Рекурсия нужна в достаточно редких случаях. Вот недавний пример - в xml лежит дерево. Каждый элемент ссылается на предыдущий элемент (parent). Для того что бы это дерево выстроить рекурсия нужна. А в таком случае просто apply-templates.

Cheers
Pete
...
Рейтинг: 0 / 0
10.03.2006, 13:55
    #33592725
Mr.Zlatko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с рекурсией в XSL
Извини но я наберусь смелости опротестовать...с запятыми я с тобой согласен..но для решения задачи в целом без рекурсии никак...как я уже говорил в результате я должен получть многомерный масив...а точнее сложный масив масивов который по своей сути и есть деревом с родителями, потомками и так далее..вот так..
А вот конструкция <xsl:if test="position() = last()" > равна истине на первом же уровне рекурсии..пробувал <xsl:if test="position() != last()" > но ета равна истине уже на втором уровне..а мне нужно как то определть что ето последний потомок етой ветви дерева
...
Рейтинг: 0 / 0
10.03.2006, 14:07
    #33592761
B0rG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с рекурсией в XSL
хммм... несите код, будем разбираться :)

Cheers
Pete
...
Рейтинг: 0 / 0
10.03.2006, 14:16
    #33592782
Mr.Zlatko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с рекурсией в XSL
Код: 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.
<xsl:template match="item">
  <xsl:param name="level"> 0 </xsl:param>						
		
  <xsl:if test="number($level) > 0">,</xsl:if>				
		
   ['<xsl:value-of select="@name"/>'
		
   <xsl:choose>
     <xsl:when test="position() = last()">
       <xsl:choose>
         <xsl:when test="number(string-length(@handler))>0">
           ],['<xsl:value-of select="@handler"/>']
	 </xsl:when>
	 <xsl:otherwise>
	   ],['OnDefault()']
	 </xsl:otherwise>				
       </xsl:choose>
    </xsl:when>
    <xsl:otherwise>
      <xsl:apply-templates select="item" > 
        <xsl:with-param name="level" select="number($level) + 1" />
      </xsl:apply-templates>]	
    </xsl:otherwise>
  </xsl:choose>		

</xsl:template>

Вот и код..все будет работать правильно если я научуся определять что ето последний потомок или уровень рекурсии текущей ветви
...
Рейтинг: 0 / 0
10.03.2006, 14:16
    #33592784
B0rG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с рекурсией в XSL
Врубился. Пятница все таки, утро и все такое.

Вам нужен node-test на рекурсию, т.е. что то в этом роде

Код: plaintext
1.
2.
3.
<xsl:if test=" ( /xml/node/node1[ some criteria ] )">
  <!-- выполнится если нода существует -->
</xsl:if>

Cheers
Pete
...
Рейтинг: 0 / 0
10.03.2006, 14:17
    #33592787
B0rG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с рекурсией в XSL
xml то дайте :)

Cheers
Pete
...
Рейтинг: 0 / 0
10.03.2006, 14:32
    #33592845
Mr.Zlatko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с рекурсией в XSL
а я уже давал )
повторяю :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<?xml version="1.0" encoding="windows-1251"?>
<?xml-stylesheet type="text/xsl" href="menu_class.xsl"?>
<menu name="MHATAdmin">
  <item name="File">
    <item name="New">
      <item name="New1" handler="OnNew1">		
      </item>
    </item>
    <item name="Open">
      <item name="Open1" handler="OnOpen1">
      </item>
    </item>
  </item>
</menu>
...
Рейтинг: 0 / 0
10.03.2006, 15:01
    #33592947
Mr.Zlatko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с рекурсией в XSL
А вот с ноде тестом не совсем понятно увы
...
Рейтинг: 0 / 0
10.03.2006, 15:26
    #33593063
B0rG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с рекурсией в XSL
бежать надо

попробуйте сами отсюда

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
<?xml version="1.0" encoding="windows-1251"?>
<?xml-stylesheet type="text/xsl" href="menu_class.xsl"?>
<menu name="MHATAdmin">
  <item name="File">
    <item name="New">
      <item name="Newnotlast">		
      </item>

      <item name="New1" handler="OnNew1">		
      </item>
    </item>
    <item name="Open">
      <item name="opennotlast">
      </item>

      <item name="Open1" handler="OnOpen1">
      </item>
    </item>
  </item>
</menu>

Код: 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.
42.
43.
44.
	
<xsl:template match="/">	
	<html>
		<title></title>
		<body>
			<xsl:apply-templates select="menu/item" />
		</body>
	</html>
</xsl:template>

	
<xsl:template match="item">
	<xsl:param name="level"> 0 </xsl:param>						
	
	[<xsl:value-of select="@name"/>
	
	<xsl:choose>
		<xsl:when test=" (./item) ">
			<!-- not last -->
			not last<br />
		
		</xsl:when>
		<xsl:otherwise>
			<!-- last -->
			<xsl:variable name="s" select="@handler" />
					
			<xsl:choose>
				<xsl:when test=" not ( @handler = '' )">
					],['<xsl:value-of select="@handler"/>']
				</xsl:when>
				<xsl:otherwise>
					],['OnDefault()']
				</xsl:otherwise>				
			</xsl:choose>

		</xsl:otherwise>
	</xsl:choose>

	
	<xsl:apply-templates select="item" > 
		<xsl:with-param name="level" select="number($level) + 1" />
	</xsl:apply-templates>]
</xsl:template>

...
Рейтинг: 0 / 0
10.03.2006, 15:54
    #33593224
Mr.Zlatko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с рекурсией в XSL
Я чуть перетасовал код на свой лад..но главное что он заработал!
Огромнеишее спасибо!
...
Рейтинг: 0 / 0
11.03.2006, 18:10
    #33594504
D'esperado
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с рекурсией в XSL
Mr.Zlatko...но главное что он заработал!
...

На мой взгляд, "главное" все-таки, не в том, чтобы код заработал (заставить его "работать" можно 10К-ми способами), а в том, чтобы разобраться в сути обсуждаемой проблемы и дать адекватный ответ, соответствующий поставленной задаче, а не пытаться подогнать под желаемый результат "нагромождение" xsl:choose -ов, xsl:variable -ов и пр. xsl:with-param -ов там, где они и нахрен никому не нужны:
Код: 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.
<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
	<html>
		<title></title>
		<body>
		<pre>
			<xsl:apply-templates select="/menu/item" />
		</pre>
		</body>
	</html>
</xsl:template>

<xsl:template match="item[not(item)]">
<!--                 ^^^^^^^^^^^^^^^
      конец вашей рекурсии будет тут... -->
	[<xsl:value-of select="@name"/>],['<xsl:value-of select="@handler"/>']
</xsl:template>

<xsl:template match="item">
<!--                 ^^^^
      а тут будут обрабатываться "все остальные" item-s... -->
    [<xsl:value-of select="@name"/><xsl:apply-templates />
    ]<-- <xsl:value-of select="@name"/> end
</xsl:template>
</xsl:stylesheet>

З.Ы. учите матчасть, ребята...
...
Рейтинг: 0 / 0
11.03.2006, 18:18
    #33594507
D'esperado
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с рекурсией в XSL
D'esperado...
З.Ы. учите матчасть, ребята...


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
....
<xsl:template match="item">
<!--                 ^^^^
      а тут будут обрабатываться "все остальные" item-s... -->
    [<xsl:value-of select="@name"/><xsl:apply-templates />
    ]&lt;-- <xsl:value-of select="@name"/> end
<!-- ^^^^
      так правильнее, это я забыл, HTML-форма "преобразит" entity-substitution в изображаемый символ... -->
</xsl:template>
</xsl:stylesheet>
...
Рейтинг: 0 / 0
13.03.2006, 11:50
    #33596013
Mr.Zlatko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с рекурсией в XSL
Ну все приходит с опытом..не читав вашых 2 последних постов, а почитав матчасть
на выходных я и сам дошел к любезно предоставленому вами решению, хотя решения у меня сложилося только на теоретическом уровне...поетому за пример искренне благодарен!
...
Рейтинг: 0 / 0
13.03.2006, 14:17
    #33596712
B0rG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с рекурсией в XSL
D'esperado
... соответствующий поставленной задаче, а не пытаться подогнать под желаемый результат "нагромождение" xsl:choose -ов, xsl:variable -ов и пр. xsl:with-param -ов там, где они и нахрен никому не нужны:
[src]

виноват вашблагородие, убегал торопился, код не почистил. with-param остался от старой версии. Мысль то была простая - ведем рекусию, смотрим есть ли child node, если есть ставим запятую.
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Проблема с рекурсией в XSL / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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