Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSLT заменить значения / 5 сообщений из 5, страница 1 из 1
25.12.2008, 19:50
    #35735919
michael R
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT заменить значения
Код: 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
26.12.2008, 16:39
    #35737545
michael R
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT заменить значения
вот так забацал вроде работает

Код: 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
28.12.2008, 18:18
    #35738795
michael R
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT заменить значения
вроде работает
но для большого количества идёт очень долго
можно ли как нибудь ускорить
...
Рейтинг: 0 / 0
30.12.2008, 00:02
    #35740724
michael R
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT заменить значения
всё таки ускорил
удалось

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


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