Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как найти ближайший сверху элемент? / 8 сообщений из 8, страница 1 из 1
14.10.2010, 15:56
    #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
14.10.2010, 17:09
    #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
14.10.2010, 18:54
    #36900196
Alexander Us
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти ближайший сверху элемент?
refregУ такого XML ответ такой?
Код: plaintext
1.
ААА,  1 
BBB,  9 

Да
...
Рейтинг: 0 / 0
14.10.2010, 23:11
    #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
14.10.2010, 23:50
    #36900514
Alexander Us
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти ближайший сверху элемент?
mage.lan,
спасибо, завтра попробую.
Насчёт жести согласен. Замысловатая структура попалась.
...
Рейтинг: 0 / 0
15.10.2010, 08:41
    #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
15.10.2010, 14:08
    #36901476
Andry Trushin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти ближайший сверху элемент?
refregmage.lan, благодаря Вашему решению, нашел такое:
Угу, гораздо элегантнее выглядит.

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

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


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