powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Получить следующий узел за текущим
13 сообщений из 13, страница 1 из 1
Получить следующий узел за текущим
    #37174893
walek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.
Что-то никак не получается решить задачку.
Допустим исходник такой:
Код: 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.
<channel>
<item>
<category>Политика</category>
<ID> 1605066 </ID>
<title>Заголовок  1 </title>
<text>Какой-то текст</text>
</item>
<item>
<category>Политика</category>
<ID> 1605161 </ID>
<title>Заголовок  2 </title>
<text>Какой-то текст</text>
</item>
<item>
<category>Общество</category>
<ID> 1604912 </ID>
<title>Заголовок  3 </title>
<text>Какой-то текст</text>
</item>
<item>
<category>Общество</category>
<ID> 1604856 </ID>
<title>Заголовок  4 </title>
<text>Какой-то текст</text>
</item>
</channel>

Допустим по запросу ?ID=1605066 вывожу содержимое статьи с заголовком Заголовок 1. Отлично.
Допустим в правой колонке я хочу вывести все названия статьи категории, в которой находится статья с Заголовком 1 и которая имеет ID=1605066. Справился.

Но я хочу большего, и хочу вывести на страницу название следующей категории, которая следует за текущей категорией, т. е. если я нахожусь в категории «Политика», на этой же странице хочу вывести «Общество».

Не могу найти правильный XPath-путь. Подскажите пожалуйста.
Вывод правого блока
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<xsl:template match="channel">
  <xsl:apply-templates select="item[category=../item[ID=$ArtID]/category]" mode="type" />
</xsl:template>

<xsl:template match="item" mode="type">
  <xsl:choose>
    <xsl:when test="title = ../item[ID=$ArtID]/title">
      <h3 class="notdescription" style="font-size: 1.1em;"><xsl:value-of select="title" disable-output-escaping="yes" /></h3>
    </xsl:when>
  </xsl:choose>
</xsl:template>

Спасибо.
...
Рейтинг: 0 / 0
Получить следующий узел за текущим
    #37175058
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
walek,

Код: plaintext
1.
2.
3.
4.
<xsl:template match="item" mode="type">
	...
	<xsl:value-of select="following-sibling::item[category!=current()/category][1]/category"/>
	...
</xsl:template>
...
Рейтинг: 0 / 0
Получить следующий узел за текущим
    #37175767
walek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
refregwalek,

Код: plaintext
1.
2.
3.
4.
<xsl:template match="item" mode="type">
	...
	<xsl:value-of select="following-sibling::item[category!=current()/category][1]/category"/>
	...
</xsl:template>

Спасибо, а как проигнорировать элементы дубликаты?
...
Рейтинг: 0 / 0
Получить следующий узел за текущим
    #37175831
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
walekСпасибо, а как проигнорировать элементы дубликаты?В этом XPath дубликаты в принципе невозможны, т.к. выводится всего один элемент. Они возникают из-за
Код: plaintext
select="item[category=../item[ID=$ArtID]/category]"
Как ты избавился от дубликатов в этом XPath ?
...
Рейтинг: 0 / 0
Получить следующий узел за текущим
    #37175870
walek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
refregВ этом XPath дубликаты в принципе невозможны, т.к. выводится всего один элемент. Они возникают из-за
Код: plaintext
select="item[category=../item[ID=$ArtID]/category]"
Как ты избавился от дубликатов в этом XPath ?
Я сделал так:
Код: plaintext
<xsl:apply-templates select="item[category=../item[ID=$ArtID]/category][1]" />

Но мне кажется это кривое решение, что скажете?
...
Рейтинг: 0 / 0
Получить следующий узел за текущим
    #37175889
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
walek,

трудно сказать, я же не знаю, что в результате должно быть...
Сдается мне в твою задачу <xsl:key> не мешает засунуть, раз идет группировка - но это на любителя
...
Рейтинг: 0 / 0
Получить следующий узел за текущим
    #37175899
walek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
refregwalek,

трудно сказать, я же не знаю, что в результате должно быть...
Сдается мне в твою задачу <xsl:key> не мешает засунуть, раз идет группировка - но это на любителя
На выходе хочу получить не массив Общество, Общество, Общество (количество зависит от наличия айтемов с одинаковыми категориями, а хочу получить просто Общество (единственную категорию из множества одинаковых по названию).

И ещё.
Почему не работает отбор предшествующих узлов, например так:
Код: plaintext
<xsl:value-of select="preceding-sibling::item[not(category=current()/category)]/category"/>
...
Рейтинг: 0 / 0
Получить следующий узел за текущим
    #37175926
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
walekНа выходе хочу получить не массив Общество, Общество, Общество (количество зависит от наличия айтемов с одинаковыми категориями, а хочу получить просто Общество (единственную категорию из множества одинаковых по названию).
Не надо слов, приведи результирующий XML(HTML) - если html, то упрощенный без раскрасок
walekИ ещё.
Почему не работает отбор предшествующих узлов, например так:
Код: plaintext
<xsl:value-of select="preceding-sibling::item[not(category=current()/category)]/category"/>
Во-первых, это должно быть внутри шаблона item ;
Во-вторых, предыдущих и последующих категорий может и не быть.
Если с проблемой не угадал, приводи xsl
...
Рейтинг: 0 / 0
Получить следующий узел за текущим
    #37176009
walek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot refreg]Не надо слов, приведи результирующий XML(HTML) - если html, то упрощенный без раскрасок

refregВо-первых, это должно быть внутри шаблона item ;
Во-вторых, предыдущих и последующих категорий может и не быть.
Если с проблемой не угадал, приводи xsl
1. Вроде они внутри шаблона
2. Да, может и не быть

XSLT у меня огромный, но попробую вытащить то, что нужно.
Ситуация такая.
У меня парсится газета. По запросу по ID-статьи парсятся статьи.
В статьях, в правом блоке выводятся заголовки всех статей, которые принадлежат категории, например
Политика
Заголовок 1
Заголовок 2
Заголовок 3
Заголовок 4
...

Тут же хочу сделать навигация по категориям, т. е. допустим мы находимся в статье, которая принадлежит категории Политика, а следующая за ней категория Общество. Я хочу вывести ссылку, при клике на которую будет загружаться первая статья из категории Общество.

Всего категорий 16.

Приведу конкретный пример:
Код: plaintext
<a href="">Инвестиции и финансы</a> | <a href="KommArt.asp?IssID=D11047MO&ArtID=1605079">Потребительский Рынок</a><div style="margin-right: 4.8%; margin-left: 5%; padding-bottom: 40px;"><div style="clear: both; margin-bottom: 20px;"><div class="b-issue" style="float: left; width: 60%; padding-right: 5%;"><h3 class="b-issue_title">В South Stream войдет Wintershall</h3><p class="b-issue_fulltext"><SPAN class="title0">  </SPAN> <BR>  <SPAN class="paragraph">Немецкая Wintershall (дочерняя структура BASF) в ближайшее время может войти в проект строительства газопровода South Stream, сообщили источники "Ъ", близкие к "Газпрому". Официально в "Газпроме" ситуацию не комментируют. До этого о том, что к проекту может присоединиться германская компания, говорил глава итальянской ENI (принадлежит  50 % в проекте) Паоло Скарони в интервью Wall Street Journal, не уточняя, о ком именно идет речь. По его словам, это должно придать проекту прочность с точки зрения его восприятия в ЕС. Еще одним партнером в строительстве South Stream должна стать французская EDF, но какую долю получат новые участники, пока не сообщается. Wintershall уже является партнером "Газпрома" по другому газопроводу -- Nord Stream, который пройдет по дну Балтийского моря в Германию. В консорциум Nord Stream также входят германский Е.ON Ruhrgas AG, нидерландская Gasunie и французская GDF Suez SA.  </SPAN><BR><BR></p><p class="b-issue_link"><a href="http://www.kommersant.ru/doc-rss.aspx?DocsID=1605030">Постоянный адрес страницы</a></p></div><div style="float: left; width: 30%; padding-left: 15%;"><p style="margin-top: 20px; font-size: 1.2em; font-weight: bold;">Промышленность и Энергоресурсы</p><h3 class="notdescription" style="font-size: 1.1em;"><a href="KommArt.asp?IssID=D11047MO&ArtID=1605029">Аркадий Ротенберг вошел в "Газпром бурение"</a></h3><h3 class="notdescription" style="font-size: 1.1em;"><a href="KommArt.asp?IssID=D11047MO&ArtID=1605033">"Зарубежнефть" пробурит Иорданию</a></h3><h3 class="notdescription" style="font-size: 1.1em;"><a href="KommArt.asp?IssID=D11047MO&ArtID=1605026">Французов распределили в Сибирь</a></h3><h3 class="notdescription" style="font-size: 1.1em;">В South Stream войдет Wintershall</h3><h3 class="notdescription" style="font-size: 1.1em;"><a href="KommArt.asp?IssID=D11047MO&ArtID=1605017">Наталье Филевой разрешили купить S7</a></h3></div></div><div style="clear: both;"></div></div>

В этом примере:
текущая категория — Промышленность и Энергоресурсы
категория, при на клике на которую будет загружаться первая статья последующей категории — Потребительский Рынок
предыдущая категория (но не работает, ссылка пустая) — Инвестиции и финансы

Тут не работает только ссылка на предыдущую категорию.

Понятней стало?
...
Рейтинг: 0 / 0
Получить следующий узел за текущим
    #37176158
walek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
refreg, если вам не понятно, могу нарисовать.
...
Рейтинг: 0 / 0
Получить следующий узел за текущим
    #37176163
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
walek,

Еще раз. у тя в 1 посте тестовый(маленький) xml, тестовый(маленький) xsl
Можно сделать новый xsl, c учетом решенных вопросов. И, показать какой (маленький) xml должен получится в идале.

Почему, очевидные вещи приходится объяснять? Вот как на пост выше те можно дать ответ? Это какое-то ТЗ получается. Сделать за тя всю работу?
...
Рейтинг: 0 / 0
Получить следующий узел за текущим
    #37176182
walek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
refregwalek,

Еще раз. у тя в 1 посте тестовый(маленький) xml, тестовый(маленький) xsl
Можно сделать новый xsl, c учетом решенных вопросов. И, показать какой (маленький) xml должен получится в идале.

Почему, очевидные вещи приходится объяснять? Вот как на пост выше те можно дать ответ? Это какое-то ТЗ получается. Сделать за тя всю работу?refreg, прошу прощения если вы не поняли, мне показалось, что небольшого кусочка xml будет достаточно. Безусловно, за меня не нужно сделать всю работу. Я сам справлюсь. Спасибо вам за помощь.
...
Рейтинг: 0 / 0
Получить следующий узел за текущим
    #37176212
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
walekrefreg, прошу прощения если вы не поняли... - то, что вам надо, понятно уже с первого поста. Учитесь делать тестовые примеры...
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Получить следующий узел за текущим
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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