powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Выбор диапазонов
2 сообщений из 2, страница 1 из 1
Выбор диапазонов
    #34883116
Golden1981
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Имеется следующая проблема.
Имеем XML след. формата:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<root>
    <node title="a"/>
    <node element="bla-bla-bla 1"/>
    <node element="bla-bla-bla 2"/>
    <node element="bla-bla-bla 3"/>
    ...
    <node element="bla-bla-bla N1"/>
    <node title="b"/>
    <node element="bla-bla-bla 1"/>
    <node element="bla-bla-bla 2"/>
    <node element="bla-bla-bla 3"/>
    ...
    <node element="bla-bla-bla N2"/>
    <node title="c"/>
    ...
</root>
На самом деле структура намного сложнее, но в данной задаче от остального абстрагируемся

Нужно группировать элементы по заголовкам, т.е. обрабатывать отдельно элементы под первым заголовком, под вторым, под третьим и т.п.
Пробовал нарисовать такую конструкцию:
Код: 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.
<?xml version="1.0" encoding="windows-1251" ?>  

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="root">
    <xsl:for-each select="node">
    	<xsl:if test="@title">
	    	<xsl:variable name="Title" select="@title"/>

	    	<xsl:variable name="pos1" select="position()"/>
	    	<xsl:for-each select="following::node">
	    		<xsl:if test="@title">
	    	 		<xsl:variable name="pos2" select="$pos1 + position()"/>
	    	 		<xsl:for-each select="/root/node">
	    	 			<xsl:if test="(position() < $pos2) and (position() > $pos1)">
	    	 			
							Title = "<xsl:value-of select="$Title"/>", <br/>
							Element = "<xsl:value-of select="@element"/>", <br/>
							
	    	 			</xsl:if>
	    	 		</xsl:for-each>
    	 		</xsl:if>
	    	 </xsl:for-each>
    	 </xsl:if>

	</xsl:for-each>

</xsl:template>

</xsl:stylesheet> 
Проблема:
как остановить второй for-each, чтобы мы перебрали элементы только между одними title? Сейчас мы, бегая по этим циклам перебираем: от первого до второго, от первого до третьего, ..., от первого до последнего, от второго до третьего, от второго до четвертого, ..., от второго до последнего и т.п.
Может у кого-то есть более изящное решение?
Исходный XML раздаётся не мной, менять его структуру понятное дело не могу :(
...
Рейтинг: 0 / 0
Выбор диапазонов
    #34885055
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<xsl:for-each select="node[@title]">
 <!--следующая нода блока-->
 <xsl:variable name="next" select="following-sibling::node[@title][1]"/>
 <!--количество нод перед текущей нодой блока-->
 <xsl:variable name="cPrev" select="count(preceding-sibling::node)"/>
 <!--количество нод перед следующей нодой блока-->
 <xsl:variable name="cNextPrev" select="count($next/preceding-sibling::node)"/>
 <!--их разность - интересующее нас количество нод между нодами + 1 -->
 <xsl:variable name="weWant" select="$cNextPrev - $cPrev"/>
 <!--position is 1-based-->
 <xsl:for-each select="following-sibling::node[position() &lt; $weWant]">
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Выбор диапазонов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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