powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как найти ближайший сверху элемент?
8 сообщений из 8, страница 1 из 1
Как найти ближайший сверху элемент?
    #36899724
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как найти ближайший сверху элемент?

Tсть XML:

Код: 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.
<?xml version="1.0" encoding="utf-8" ?>

<rootElem>
  
  <elem1>abc</elem1>
  <elem2>def</elem2>
  
  <numElem num="1">   
    <contentElem>
      <name>AAA</name>      
    </contentElem>
    <contentElem>
      <name>BBB</name>
    </contentElem>   
  </numElem>

  <contentElem>
    <name>CCC</name>    
  </contentElem>
  <contentElem>
    <name>DDD</name>
  </contentElem>

  <numElem num="2">
    <contentElem>
      <name>EEE</name>
    </contentElem>
    <contentElem>
      <name>FFF</name>
    </contentElem>
  </numElem>

  <contentElem>
    <name>GGG</name>
  </contentElem>
  <contentElem>
    <name>HHH</name>
  </contentElem>
  
</rootElem>


Для каждого элемента contentElem надо вывести его "name" и содержимое аттрибута "num" в ближайшем сверху "numElem".

должно получиться:
AAA, 1
BBB, 1
CCC, 1
DDD, 1
EEE, 2
FFF, 2
GGG, 2
HHH, 2
...
Рейтинг: 0 / 0
Как найти ближайший сверху элемент?
    #36899946
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<?xml version="1.0" encoding="utf-8"?>

<rootElem>
	<numElem num="1">
		<contentElem>
			<name>AAA</name>
			<bred>
				<bred>
					<numElem num="9"/>
				</bred>
			</bred>
		</contentElem>
		<contentElem>
			<name>BBB</name>
		</contentElem>
	</numElem>
</rootElem>

У такого XML ответ такой?
Код: plaintext
1.
ААА,  1 
BBB,  9 
...
Рейтинг: 0 / 0
Как найти ближайший сверху элемент?
    #36900196
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refregУ такого XML ответ такой?
Код: plaintext
1.
ААА,  1 
BBB,  9 

Да
...
Рейтинг: 0 / 0
Как найти ближайший сверху элемент?
    #36900474
mage.lan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
жесть, ну у вас и запросики, первый раз в жизни воспользовался осью preceding::

Код: 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.
<?xml version="1.0">
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="/">
	<xsl:apply-templates select="//contentElem" />
</xsl:template>

<xsl:template match="contentElem">
	<xsl:value-of select="name/text()" />
	<xsl:text>, </xsl:text>
	<xsl:choose>
		<xsl:when test="ancestor::numElem">
			<xsl:choose>
				<xsl:when test="preceding::numElem">
					<xsl:choose>
						<xsl:when test="count(preceding::numElem[position()=1]/preceding::*) &gt; count(ancestor::numElem[position()=1]/preceding::*)">
							<xsl:value-of select="preceding::numElem[position()=1]/@num" />
						</xsl:when>
						<xsl:otherwise>
							<xsl:value-of select="ancestor::numElem[position()=1]/@num" />
						</xsl:otherwise>
					</xsl:choose>
				</xsl:when>
				<xsl:otherwise>
					<xsl:value-of select="ancestor::numElem[position()=1]/@num" />
				</xsl:otherwise>
			</xsl:choose>
		</xsl:when>
		<xsl:when test="preceding::numElem">
			<xsl:value-of select="preceding::numElem[position()=1]/@num" />
		</xsl:when>
	</xsl:choose>
	<BR />
</xsl:template>

</xsl:stylesheet>
...
Рейтинг: 0 / 0
Как найти ближайший сверху элемент?
    #36900514
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mage.lan,
спасибо, завтра попробую.
Насчёт жести согласен. Замысловатая структура попалась.
...
Рейтинг: 0 / 0
Как найти ближайший сверху элемент?
    #36900650
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mage.lan, благодаря Вашему решению, нашел такое:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="text"/>
    <!-- -->
    <xsl:template match="/">
        <xsl:apply-templates select="//contentElem"/>
    </xsl:template>
    <!-- -->
    <xsl:template match="contentElem">
        <xsl:value-of select="./name"/>
        <xsl:text>,</xsl:text>
        <xsl:value-of select="(./preceding::numElem | ./ancestor::numElem)[last()]/@num"/>
        <xsl:text>& # 10 ;</xsl:text>
    </xsl:template>
</xsl:stylesheet>
...
Рейтинг: 0 / 0
Как найти ближайший сверху элемент?
    #36901476
Andry Trushin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refregmage.lan, благодаря Вашему решению, нашел такое:
Угу, гораздо элегантнее выглядит.

"Две головы лучше, чем ни одной" (с) Зигзаг Макряк.
...
Рейтинг: 0 / 0
Как найти ближайший сверху элемент?
    #36901667
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refreg, mage.lan

огромное спасибо!
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как найти ближайший сверху элемент?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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