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


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


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

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

Код: 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
Проблема с рекурсией в XSL
    #33589410
Mr.Zlatko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код:
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
Проблема с рекурсией в XSL
    #33590608
Фотография B0rG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну я поторопился немного

<xsl:with-param name="level" select="number($level) + 1" />
...
Рейтинг: 0 / 0
Проблема с рекурсией в XSL
    #33590674
Молчун82
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не надо вводить уровней рекурсии. Вот так будет проще:
Код: 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
Проблема с рекурсией в XSL
    #33590704
Mr.Zlatko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да спасибо заработало...и еще напоследок подскажы пожайлуйста как мне выводить в хтмл результат number($level)
...
Рейтинг: 0 / 0
Проблема с рекурсией в XSL
    #33590951
Фотография B0rG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Молчун82Не надо вводить уровней рекурсии. Вот так будет проще:


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

2 Mr.Zlatko

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

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

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

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


<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
Проблема с рекурсией в XSL
    #33592659
Фотография B0rG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вам рекурсия вообще не нужна - Молчун был прав, конечно, только вот сказать не успел :)

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

Cheers
Pete
...
Рейтинг: 0 / 0
Проблема с рекурсией в XSL
    #33592782
Mr.Zlatko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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
Проблема с рекурсией в XSL
    #33592784
Фотография B0rG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Врубился. Пятница все таки, утро и все такое.

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

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

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

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

Код: 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
Проблема с рекурсией в XSL
    #33592947
Mr.Zlatko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вот с ноде тестом не совсем понятно увы
...
Рейтинг: 0 / 0
Проблема с рекурсией в XSL
    #33593063
Фотография B0rG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бежать надо

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

Код: 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
Проблема с рекурсией в XSL
    #33593224
Mr.Zlatko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я чуть перетасовал код на свой лад..но главное что он заработал!
Огромнеишее спасибо!
...
Рейтинг: 0 / 0
Проблема с рекурсией в XSL
    #33594504
D'esperado
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Проблема с рекурсией в XSL
    #33594507
D'esperado
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Проблема с рекурсией в XSL
    #33596013
Mr.Zlatko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну все приходит с опытом..не читав вашых 2 последних постов, а почитав матчасть
на выходных я и сам дошел к любезно предоставленому вами решению, хотя решения у меня сложилося только на теоретическом уровне...поетому за пример искренне благодарен!
...
Рейтинг: 0 / 0
Проблема с рекурсией в XSL
    #33596712
Фотография B0rG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D'esperado
... соответствующий поставленной задаче, а не пытаться подогнать под желаемый результат "нагромождение" xsl:choose -ов, xsl:variable -ов и пр. xsl:with-param -ов там, где они и нахрен никому не нужны:
[src]

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


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