Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Дублирование узлов / 12 сообщений из 12, страница 1 из 1
30.10.2008, 11:51
    #35625077
Xsl
Xsl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование узлов
Привет всем!
Есть вот такой 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.
<ROOT>
	<LIN> 1 </LIN>
	<PIA><PIA01>SA</PIA01>
		 <PIA02> 435654 </PIA02>
	</PIA>
	<PIA><PIA01>IN</PIA01>
		 <PIA02> 5676 </PIA02>
	</PIA>
	<LIN> 2 </LIN>
	<PIA><PIA01>SA</PIA01>
		 <PIA02> 56732756 </PIA02>
	</PIA>
	<PIA><PIA01>IN</PIA01>
		 <PIA02> 256479786 </PIA02>
	</PIA>
	<LIN> 3 </LIN>
	<PIA><PIA01>IN</PIA01>
		 <PIA02> 45672257 </PIA02>
	</PIA>
	<LIN> 4 </LIN>
	<PIA><PIA01>IN</PIA01>
		 <PIA02> 27680576 </PIA02>
	</PIA>
</ROOT>
Делаю преобразование:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
<xsl:template match="/">
	<ORDER><xsl:apply-templates select="ROOT/LIN"/></ORDER>
</xsl:template>

<xsl:template match="LIN">
	<POSITION><xsl:value-of select="."/></POSITION>
	<xsl:apply-templates select="following-sibling::PIA[1]"/>
	<xsl:apply-templates select="following-sibling::PIA[2]"/>
</xsl:template>

<xsl:template match="PIA">
<xsl:choose>
	<xsl:when test="PIA01 = 'IN'">
	<IN><xsl:value-of select="PIA02"/></IN>
	</xsl:when>
	<xsl:when test="PIA01 = 'SA'">
	<SA><xsl:value-of select="PIA02"/></SA>
	</xsl:when>
</xsl:choose>
</xsl:template>
В результате получаю:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<ORDER>
  <POSITION> 1 </POSITION>
  <SA> 435654 </SA>
  <IN> 5676 </IN>
  <POSITION> 2 </POSITION>
  <SA> 56732756 </SA>
  <IN> 256479786 </IN>
  <POSITION> 3 </POSITION>
  <IN> 45672257 </IN>
  <IN> 27680576 </IN>
  <POSITION> 4 </POSITION>
  <IN> 27680576 </IN>
</ORDER>
Обратите внимание на POSITION 3, после него IN дублируется 2 раза. Как этого можно избежать? Что б на выходе получался вот такой xml:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<ORDER>
  <POSITION> 1 </POSITION>
  <SA> 435654 </SA>
  <IN> 5676 </IN>
  <POSITION> 2 </POSITION>
  <SA> 56732756 </SA>
  <IN> 256479786 </IN>
  <POSITION> 3 </POSITION>
  <IN> 45672257 </IN>
  <POSITION> 4 </POSITION>
  <IN> 27680576 </IN>
</ORDER>

Спасибо!
...
Рейтинг: 0 / 0
30.10.2008, 14:59
    #35625736
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование узлов
if PIA[1]/PIA01='SA'
...
Рейтинг: 0 / 0
30.10.2008, 17:07
    #35626145
Xsl
Xsl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование узлов
попробовал....:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<xsl:template match="/">
	<ORDER><xsl:apply-templates select="ROOT/LIN"/></ORDER>
</xsl:template>

<xsl:template match="LIN">
	<NUMBER><xsl:value-of select="."/></NUMBER>
	<xsl:apply-templates select="following-sibling::PIA"/>
</xsl:template>

<xsl:template match="PIA">

<xsl:if test="PIA[1]/PIA01 = 'SA'">
<SA><xsl:value-of select="PIA02"/></SA>
</xsl:if>

</xsl:template>
результат не правильный.
Код: plaintext
1.
2.
3.
4.
5.
<ORDER>
  <NUMBER> 1 </NUMBER>
  <NUMBER> 2 </NUMBER>
  <NUMBER> 3 </NUMBER>
  <NUMBER> 4 </NUMBER>
</ORDER>

может я неправильно понял куда подставлять?
...
Рейтинг: 0 / 0
30.10.2008, 17:24
    #35626198
Xsl
Xsl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование узлов
maXmoif PIA[1]/PIA01='SA'
если чесно... не пойму почему так...
мне ведь мне надо исключить повтор IN если SA отсутствует.
...
Рейтинг: 0 / 0
31.10.2008, 11:31
    #35627365
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование узлов
Xslможет я неправильно понял куда подставлять?ога
...
Рейтинг: 0 / 0
31.10.2008, 11:36
    #35627386
Xsl
Xsl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование узлов
maXmoXslможет я неправильно понял куда подставлять?ога
подскажи пожалуйста куда :)
...
Рейтинг: 0 / 0
31.10.2008, 11:47
    #35627435
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование узлов
вокруг <xsl:apply-templates select="following-sibling::PIA[2]"/>
...
Рейтинг: 0 / 0
31.10.2008, 13:05
    #35627815
Xsl
Xsl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование узлов
maXmoвокруг <xsl:apply-templates select="following-sibling::PIA[2]"/>
не получается :(
XSL
Код: plaintext
1.
2.
3.
4.
5.
6.
<xsl:template match="LIN">
	<POSITION><xsl:value-of select="."/></POSITION>
	<xsl:apply-templates select="following-sibling::PIA[1]"/>
	<xsl:if test="../PIA[1]/PIA01='SA'">
	<xsl:apply-templates select="following-sibling::PIA[2]"/>
	</xsl:if>
</xsl:template>

OUT
Код: plaintext
1.
2.
3.
4.
5.
6.
<ORDER>........
  <POSITION> 3 </POSITION>
  <IN> 45672257 </IN>
  <IN> 27680576 </IN>  ----- дублируется :(
  <POSITION> 4 </POSITION>
  <IN> 27680576 </IN>
</ORDER>
...
Рейтинг: 0 / 0
31.10.2008, 15:40
    #35628345
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование узлов
осталось только ещё чуть-чуть поднапрячь извилину и всё заработает.
...
Рейтинг: 0 / 0
03.11.2008, 09:40
    #35632002
Xsl
Xsl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование узлов
maXmoосталось только ещё чуть-чуть поднапрячь извилину и всё заработает.
просидел все выходные над этим делом.... ниче не получилось....
maXmo , пожалуйста подскажи как его сделать... это мне будет ....ц :(
...
Рейтинг: 0 / 0
03.11.2008, 19:34
    #35632723
Xsl
Xsl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование узлов
ребята спасите! пожалуйста!
может это и легкая задача... но ниче у мня не получается... :(
...
Рейтинг: 0 / 0
05.11.2008, 17:20
    #35635662
Xsl
Xsl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дублирование узлов
Огромное СПАСИБИЩЕ maXmo!!!!!!!!!!!!
Кому интересно... вот решение:
Код: plaintext
1.
2.
3.
4.
5.
6.
<xsl:template match="LIN">
	<POSITION><xsl:value-of select="."/></POSITION>
	<xsl:apply-templates select="following-sibling::PIA[1]"/>
	<xsl:if test="following-sibling::PIA[1]/PIA01='SA'">
	<xsl:apply-templates select="following-sibling::PIA[2]"/>
	</xsl:if>
</xsl:template>
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Дублирование узлов / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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