powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSLT заменить значения
5 сообщений из 5, страница 1 из 1
XSLT заменить значения
    #35735919
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<ROOT>
<A>
<D N="ZZZZ" I="5" Y="0" T="0"/>
<D N="BBBB" I="5" Y="0" T="0"/>
<D N="CCCC" I="5" Y="0" T="0"/>
<D N="AAAA" I="5" Y="0" T="0"/>
</A>
<B>
<D N="aaaa" I="5" Y="0" T="5"/>
<D N="bbbb" I="5" Y="0" T="5"/>
<D N="cccc" I="5" Y="0" T="5"/>
<D N="xxxx" I="5" Y="0" T="5"/>
</B>
</ROOT>


нужна транформация
получить список из A соответсвенно с большими буквами но T должен получить значения из блока В
и если соответсвий нет в друх блоках получить так как есть

Код: 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.
<?xml version="1.0" encoding="UTF-8"?>
         <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
         <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
         
			 <xsl:key name="skey1" match="ROOT/A/D" use="translate(@N, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" />
			 <xsl:key name="skey2" match="ROOT/B/D" use="@N" />

			 <xsl:variable name="set1" select="ROOT/A/D" />
			 <xsl:template  match="ROOT">
			 <ROOT>
				 <xsl:call-template  name="AGE" />
			 </ROOT>
			 </xsl:template>
			 
			 <xsl:template name="AGE" match="ROOT">
				 <ROOT>
				  <xsl:copy-of select="$set1" />
					 <xsl:for-each select="//ROOT/B/D">
							 <xsl:if test="count(key('skey1', translate(@N,'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')))=0" >
								 <xsl:copy-of select="key('skey2', @N)"/>
							 </xsl:if>
					 </xsl:for-each>
					
				 </ROOT>
         </xsl:template>
         </xsl:stylesheet>

вопрос как заменить значения для Т


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
	<D N="ZZZZ" I="5" Y="0" T="0"/>
	<D N="BBBB" I="5" Y="0" T="5"/>
	<D N="CCCC" I="5" Y="0" T="5"/>
	<D N="AAAA" I="5" Y="0" T="5"/>
	<D N="xxxx" I="5" Y="0" T="5"/>
</ROOT>

спасибо
...
Рейтинг: 0 / 0
XSLT заменить значения
    #35737545
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот так забацал вроде работает

Код: 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.
42.
<?xml version="1.0" encoding="UTF-8"?>
         <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
         <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
         
			 <xsl:key name="skey1" match="ROOT/A/D" use="translate(@N, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" />
			 <xsl:key name="skey2" match="ROOT/B/D" use="@N" />
			 <xsl:key name="skey3" match="ROOT/B/D" use="translate(@N, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" />			 

			
			 <xsl:template  match="ROOT">
			 <ROOT>
				 <xsl:call-template  name="AGE" />
			 </ROOT>
			 </xsl:template>
			 
			 <xsl:template name="AGE" match="ROOT">
				 <ROOT>
					 <xsl:for-each select="//ROOT/A/D">
							 <xsl:element name="D">
								 <xsl:attribute name="N"><xsl:value-of select="@N"/></xsl:attribute>
								 <xsl:attribute name="I"><xsl:value-of select="@I"/></xsl:attribute>
								 <xsl:attribute name="Y"><xsl:value-of select="@Y"/></xsl:attribute>
								 <xsl:attribute name="T">
										<xsl:if test="count(key('skey3', translate(@N,'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')))!=0" >								 
												<xsl:value-of select="//ROOT/B/D[translate(@N,'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')=translate(current()/@N,'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')]/@T"/>
										</xsl:if>
										<xsl:if test="count(key('skey3', translate(@N,'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')))=0" >								 
											 <xsl:value-of  select="@T"/>										
										</xsl:if>
								 </xsl:attribute>								 
							 </xsl:element>
					 </xsl:for-each >

					 <xsl:for-each select="//ROOT/B/D">
							 <xsl:if test="count(key('skey1', translate(@N,'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')))=0">
								 <xsl:copy-of   select="key('skey2', @N)"/>
							 </xsl:if>
					 </xsl:for-each>
					
				 </ROOT>
         </xsl:template>
         </xsl:stylesheet>
...
Рейтинг: 0 / 0
XSLT заменить значения
    #35738795
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вроде работает
но для большого количества идёт очень долго
можно ли как нибудь ускорить
...
Рейтинг: 0 / 0
XSLT заменить значения
    #35740724
Фотография michael R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всё таки ускорил
удалось

Код: 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.
42.
43.
44.
45.
46.
47.
48.
<?xml version="1.0" encoding="UTF-8"?>
         <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
         <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
         
			 <xsl:key name="skey1" match="ROOT/A/D" use="translate(@N, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>
			 <xsl:key name="skey2" match="ROOT/B/D" use="@N"/>
			 <xsl:key name="skey3" match="ROOT/B/D" use="translate(@N, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>			 
			 <xsl:key name="skey4" match="ROOT/A/D" use="@N"/>			 
		 
			 <xsl:template  match="ROOT">
			 <ROOT>
				 <xsl:call-template  name="AGE" />
			 </ROOT>
			 </xsl:template>
			 
			 
			 <xsl:template name="AGE" match="ROOT">
				 <ROOT>
				 
					 <xsl:for-each select="//ROOT/A/D">
						<xsl:choose>
							<xsl:when test="count(key('skey3', translate(@N,'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')))=0">								 
								<xsl:copy-of select="key('skey4', @N)" />  							
							</xsl:when>
							<xsl:otherwise>
							<xsl:element name="D">
									<xsl:attribute name="N"><xsl:value-of select="@N"/></xsl:attribute>
									<xsl:attribute name="I"><xsl:value-of select="@I"/></xsl:attribute>
									<xsl:attribute name="Y"><xsl:value-of select="@Y"/></xsl:attribute>
									<xsl:attribute name="T">
									<xsl:for-each select="key('skey3',translate(@N,'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'))" >
										<xsl:value-of  select="@T"/>
									</xsl:for-each>	
									</xsl:attribute>	
							    </xsl:element>									
							</xsl:otherwise>
						</xsl:choose>
					 </xsl:for-each >

					 <xsl:for-each select="//ROOT/B/D">
							 <xsl:if test="count(key('skey1', translate(@N,'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')))=0">
								 <xsl:copy-of   select="key('skey2', @N)"/>
							 </xsl:if>
					 </xsl:for-each>
					
				 </ROOT>
         </xsl:template>
         </xsl:stylesheet>

несколько сот тысяч строк обрабатывается за 7 секунд
...
Рейтинг: 0 / 0
XSLT заменить значения
    #35743557
Grundiss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Славненькая темка )))) Сам с собой чувак поговорил ))))
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSLT заменить значения
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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