Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / помогите сделать xslt или xquery переобразование с группировкой и обединением / 25 сообщений из 29, страница 1 из 2
11.03.2011, 23:22
    #37160628
yurar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите сделать xslt или xquery переобразование с группировкой и обединением
Здраствуйте, проблема вот в чем: надо переобразовать XML-документ с такой структурой
автор<database>
<name>museum</name>
<table>
<name>ob_exhibit</name>
<initialization>
<insert>
<field>
<name>id</name>
<value>6289</value>
</field>
<field>
<name>Name</name>
<value>Богоматір(ікона)</value>
</field>
<field>
<name>Collection_Id</name>
<value>Музика</value>
</field>
<field>
<name>Autor_id</name>
<value># 1</value>
</field>
</insert>
<insert>
<field>
<name>id</name>
<value>6040</value>
</field>
<field>
<name>Name</name>
<value>Сибір-небо</value>
</field>
<field>
<name>Collection_Id</name>
<value>Музика</value>
</field>
<field>
<name>Autor_id</name>
<value># 2</value>
</field>
</insert>
</initialization>
</table>
<table>
<name>ob_exhibit2</name>
<initialization>
<insert>
<field>
<name>id</name>
<value>6289</value>
</field>
<field>
<name>Material</name>
<value>пластик</value>
</field>
</insert>
<insert>
<field>
<name>id</name>
<value>6040</value>
</field>
<field>
<name>Material</name>
<value>камінь</value>
</field>
</insert>
</initialization>
</table>
</database>

в такой

автор<database>
<ob_exhibit>
<row>
<id>6289</id>
<Name>Богоматір(ікона)</Name>
<Collection_Id>Музика</Collection_Id>
<Autor_id># 1</Autor_id>
<Material>пластик</Material>
</row>
<row>
<id>6040</id>
<Name>Сибір-небо</Name>
<Collection_Id>Музика</Collection_Id>
<Autor_id># 2</Autor_id>
<Material>камінь</Material>
</row>
</ob_exhibit>
</database>

тоесть надо сгруппировать значения из двух таблиц предоставленых в виде XML по полю id и обеденить значения других тэгов
...
Рейтинг: 0 / 0
12.03.2011, 11:35
    #37160906
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите сделать xslt или xquery переобразование с группировкой и обединением
Код: 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.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
	<!-- -->
	<xsl:key name="table2" match="/database/table[2]/initialization/insert" use="field[1]/value"/>
	<!-- -->
	<xsl:template match="/">
		<database>
			<ob_exhibit>
				<xsl:apply-templates select="/database/table[1]/initialization/insert"/>
			</ob_exhibit>
		</database>
	</xsl:template>
	<!-- -->
	<xsl:template match="insert">
		<row>
			<xsl:for-each select="field">
				<xsl:element name="{name}">
					<xsl:value-of select="value"/>
				</xsl:element>
			</xsl:for-each>
			<Material>
				<xsl:value-of select="key('table2',field[1]/value)/field[2]/value"/>
			</Material>
		</row>
	</xsl:template>
</xsl:stylesheet>
...
Рейтинг: 0 / 0
12.03.2011, 12:40
    #37160979
yurar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите сделать xslt или xquery переобразование с группировкой и обединением
большое спасибо, все работает
...
Рейтинг: 0 / 0
12.03.2011, 13:24
    #37161029
yurar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите сделать xslt или xquery переобразование с группировкой и обединением
а как сделать такое преобразование:
имеем файл
автор<dbo.ob_exhibit id="0001" Name="Богоматір(ікона)" Collection_Id="Музика" Material="пластик"/>

нужно получить
автор<database>
<ob_exhibit>
<row>
<id>001</id>
<Name>Богоматір(ікона)</Name>
<Collection_Id>Музика</Collection_Id>
<Material>пластик</Material>
</row>
</ob_exhibit>
</database>
не знаю как обращатса к атрибутам и их значениям
...
Рейтинг: 0 / 0
12.03.2011, 13:29
    #37161039
yurar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите сделать xslt или xquery переобразование с группировкой и обединением
вот написал такой код
автор<xsl:template match="/">
<database>
<xsl:element name="ob_exhibit">
<row>
<xsl:element name="id">
<xsl:value-of select="@id"/>
</xsl:element>
<xsl:element name="Name">
<xsl:value-of select="@Name"/>
</xsl:element>
<xsl:element name="Collection_Id">
<xsl:value-of select="@Collection_Id"/>
</xsl:element>
<xsl:element name="Material">
<xsl:value-of select="@Material"/>
</xsl:element>
</row>
</xsl:element>
</database>
</xsl:template>

все работает, но хотелось бы чтото уневерсальнее
...
Рейтинг: 0 / 0
12.03.2011, 13:55
    #37161058
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите сделать xslt или xquery переобразование с группировкой и обединением
yurar,

так?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
	<xsl:template match="/">
		<database>
			<xsl:apply-templates select="dbo.ob_exhibit"/>
		</database>
	</xsl:template>
	<!-- -->
	<xsl:template match="dbo.ob_exhibit">
		<xsl:element name="ob_exhibit">
			<row>
				<xsl:for-each select="@*">
					<xsl:element name="{name()}">
						<xsl:value-of select="."/>
					</xsl:element>
				</xsl:for-each>
			</row>
		</xsl:element>
	</xsl:template>
</xsl:stylesheet>
...
Рейтинг: 0 / 0
12.03.2011, 21:03
    #37161504
yurar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите сделать xslt или xquery переобразование с группировкой и обединением
refreg, спасибо, все работает как надо

а как обеденить два файла?
например, один файл
автор<dbo.ob_exhibit id="0001" Name="Богоматір(ікона)"/>
и второй файл автор<dbo.ob_exhibit2 id="0001" Material="фанера" />
надо их обеденить по значению атрибута id

написал вот такой код, но он не работае.
автор<xsl:stylesheet xmlns:xsl=" http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<database>
<xsl:apply-templates select="dbo.ob_exhibit"/>
</database>
</xsl:template>
<!-- -->
<xsl:template match="dbo.ob_exhibit">
<xsl:element name="ob_exhibit">
<xsl:for-each select="dbo.ob_exhibit">
<xsl:variable name="var1" select="."/>
<xsl:variable name="var2" select="document(sqlserver2.xml)/dbo.ob_exhibit2"/>
<row>
<xsl:element name="Exhibit_id">
<xsl:if test="((./@id) = @id) != 'false'">
<xsl:value-of select="@id"/>
</xsl:if>
</xsl:element>
<xsl:element name="ExhName">
<xsl:value-of select="@Name"/>
</xsl:element>
<xsl:element name="Material_id">
<xsl:for-each select="$var2">
<xsl:value-of select="@Material"/>
</xsl:for-each>
</xsl:element>

</row>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Что в нем не так?
...
Рейтинг: 0 / 0
12.03.2011, 21:24
    #37161534
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите сделать xslt или xquery переобразование с группировкой и обединением
yurar,

document( ' sqlserver2.xml ' )
...
Рейтинг: 0 / 0
12.03.2011, 21:37
    #37161553
yurar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите сделать xslt или xquery переобразование с группировкой и обединением
refreg,

исправил, но результат также <database/>
...
Рейтинг: 0 / 0
12.03.2011, 21:59
    #37161587
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите сделать xslt или xquery переобразование с группировкой и обединением
Это что за конструкция? У тя в dbo.ob_exhibit есть вложенный элемент dbo.ob_exhibit ?
yurar
Код: plaintext
1.
2.
<xsl:template match="dbo.ob_exhibit">
		<xsl:element name="ob_exhibit">
			<xsl:for-each select="dbo.ob_exhibit">


Без комментариев:
Код: plaintext
<xsl:if test="((./@id) = @id) != 'false'">
...
Рейтинг: 0 / 0
12.03.2011, 23:01
    #37161709
yurar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите сделать xslt или xquery переобразование с группировкой и обединением
refreg, спасибо
извиняюсь за столь глупую ошибку, я только недавно начал расбиратся с XSLT

правильно будет написать
автор<xsl:if test="((./@id) = @id)">

Все работает, еще раз спасибо
...
Рейтинг: 0 / 0
13.03.2011, 04:42
    #37161873
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите сделать xslt или xquery переобразование с группировкой и обединением
yurarправильно будет написать
автор<xsl:if test="((./@id) = @id)">Все равно не правильно. Условие всегда будет истинно, т.к. слева и справа от равенства стоит одно и то же, по разному написанное.

Подозреваю, что условие должно быть такое:
Код: plaintext
<xsl:if test="@id=$var2/@id">
Ну, и еще, что касается логики объединения двух файлов, либо второй файл надо крутить в цикле для каждого элемента первого файла, либо создавать по нему ключ, и искать по ключу. Если в каждом файле по одной строке - этого не понять...
...
Рейтинг: 0 / 0
13.03.2011, 21:13
    #37162507
yurar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите сделать xslt или xquery переобразование с группировкой и обединением
refreg, спасибо за полезные советы

есть документ с такой структурой
автор<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2010-04-12T17:12:19">
<exhibit>
<id>6001</id>
<Name>Богоматір(ікона)</Name>
<Collection_Id>Музика</Collection_Id>
<Autor_id>Autor 1</Autor_id>
</exhibit>
<exhibit>
<id>6002</id>
<Name>Сибір-небо</Name>
<Collection_Id>Музика</Collection_Id>
<Autor_id>Autor 2</Autor_id>
</exhibit>
<exhibit2>
<id>6001</id>
<Material_id>пластик</Material_id>
</exhibit2>
<exhibit2>
<id>6002</id>
<Material_id>дерево</Material_id>
</exhibit2>
</dataroot>


надо обеденить содержимое тєгов exhibit и exhibit2 по значению тєга id .
Написал такой код
автор <xsl:key name="table2" match="/dataroot/exhibit2" use="id"/>
<!-- -->
<xsl:template match="/">
<database>
<ob_exhibit>
<xsl:apply-templates select="/database/exhibit"/>
</ob_exhibit>
</database>
</xsl:template>
<!-- -->
<xsl:template match="exhibit">
<row>
<xsl:for-each select="id">
<xsl:element name="Exhibit_id">
<xsl:value-of select="value"/>
</xsl:element>
</xsl:for-each>
<xsl:for-each select="Name">
<xsl:element name="ExhName">
<xsl:value-of select="value"/>
</xsl:element>
</xsl:for-each>
<xsl:for-each select="Collection_Id">
<xsl:element name="ExhCollection">
<xsl:value-of select="value"/>
</xsl:element>
</xsl:for-each>
<xsl:for-each select="Autor_id">
<xsl:element name="ExhAutor">
<xsl:value-of select="value"/>
</xsl:element>
</xsl:for-each>

<xsl:element name="Material">
<xsl:value-of select="key('table2',id)/id"/>
</xsl:element>
</row>
</xsl:template>
</xsl:stylesheet>

Что в нём не так?
...
Рейтинг: 0 / 0
13.03.2011, 21:40
    #37162540
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите сделать xslt или xquery переобразование с группировкой и обединением
yurar,

Код: 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.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
	<xsl:key name="table2" match="/dataroot/exhibit2" use="id"/>
	<!-- -->
	<xsl:template match="/">
		<database>
			<ob_exhibit>
				<xsl:apply-templates select="/dataroot/exhibit"/>
			</ob_exhibit>
		</database>
	</xsl:template>
	<!-- -->
	<xsl:template match="exhibit">
		<row>
			<xsl:for-each select="id">
				<xsl:element name="Exhibit_id">
					<xsl:value-of select="."/>
				</xsl:element>
			</xsl:for-each>
			<xsl:for-each select="Name">
				<xsl:element name="ExhName">
					<xsl:value-of select="."/>
				</xsl:element>
			</xsl:for-each>
			<xsl:for-each select="Collection_Id">
				<xsl:element name="ExhCollection">
					<xsl:value-of select="."/>
				</xsl:element>
			</xsl:for-each>
			<xsl:for-each select="Autor_id">
				<xsl:element name="ExhAutor">
					<xsl:value-of select="."/>
				</xsl:element>
			</xsl:for-each>
			<xsl:element name="Material">
				<xsl:value-of select="key('table2',id)/id"/>
			</xsl:element>
		</row>
	</xsl:template>
</xsl:stylesheet>
...
Рейтинг: 0 / 0
13.03.2011, 21:49
    #37162552
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите сделать xslt или xquery переобразование с группировкой и обединением
Но лучше так, в примере выше просто показано, в чем ошибки:
Код: 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.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
	<xsl:key name="table2" match="/dataroot/exhibit2" use="id"/>
	<!-- -->
	<xsl:template match="/">
		<database>
			<ob_exhibit>
				<xsl:apply-templates select="/dataroot/exhibit"/>
			</ob_exhibit>
		</database>
	</xsl:template>
	<!-- -->
	<xsl:template match="exhibit">
		<row>
			<Exhibit_id>
				<xsl:value-of select="id"/>
			</Exhibit_id>
			<ExhName>
				<xsl:value-of select="Name"/>
			</ExhName>
			<ExhCollection>
				<xsl:value-of select="Collection_Id"/>
			</ExhCollection>
			<ExhAutor>
				<xsl:value-of select="Autor_id"/>
			</ExhAutor>
			<xsl:element name="Material">
				<xsl:value-of select="key('table2',id)/id"/>
			</xsl:element>
		</row>
	</xsl:template>
</xsl:stylesheet>
...
Рейтинг: 0 / 0
13.03.2011, 21:52
    #37162553
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите сделать xslt или xquery переобразование с группировкой и обединением
Да, и еще, если материал надо текстом, то так:
Код: plaintext
<xsl:value-of select="key('table2',id)/Material_id"/>
...
Рейтинг: 0 / 0
13.03.2011, 22:42
    #37162613
yurar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите сделать xslt или xquery переобразование с группировкой и обединением
refreg, большое спасибо. теперь уже понял как использовать ключи
...
Рейтинг: 0 / 0
13.03.2011, 23:29
    #37162682
yurar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите сделать xslt или xquery переобразование с группировкой и обединением
для заданого файла
автор<database>
<name>museum</name>
<table>
<name>exhibits</name>
...
</table>
<table>
<name>Autors</name>
...
<.table>

как записать, чтоб шаблон только накладывался на таблицу с названием exhibits ?
...
Рейтинг: 0 / 0
13.03.2011, 23:45
    #37162705
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите сделать xslt или xquery переобразование с группировкой и обединением
yurar,

Код: plaintext
select="/database/table[name='exhibits']"
...
Рейтинг: 0 / 0
14.03.2011, 22:18
    #37164646
yurar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите сделать xslt или xquery переобразование с группировкой и обединением
refreg,

автор
<xsl:template match="/">
<database>
<xsl:apply-templates select="/database/table[name='exhibits']"/>
</database>
</xsl:template>
<!-- -->
<xsl:template match="table[name='exhibits']">
...
</xsl:template>

а тогда в match так?
...
Рейтинг: 0 / 0
15.03.2011, 00:11
    #37164749
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите сделать xslt или xquery переобразование с группировкой и обединением
Так правильно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
<xsl:template match="/">
	<database>
		<xsl:apply-templates select="/database/table[name='exhibits']"/>
	</database>
</xsl:template>
<!-- -->
<xsl:template match="table">
...
</xsl:template>
А если несколько обработок нужно для table , используется атрибут mode
...
Рейтинг: 0 / 0
15.03.2011, 00:24
    #37164768
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите сделать xslt или xquery переобразование с группировкой и обединением
refregА если несколько обработок нужно для table , используется атрибут mode И чем это лучше, чем список шаблонов с разным match?
...
Рейтинг: 0 / 0
15.03.2011, 00:54
    #37164810
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите сделать xslt или xquery переобразование с группировкой и обединением
_Vasilisk_refregА если несколько обработок нужно для table , используется атрибут mode И чем это лучше, чем список шаблонов с разным match?Ок... можно без mode... только это лучше делать в другом варианте обработки, в таком:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
	<xsl:template match="/">
		<database>
			<xsl:apply-templates select="/database/table"/>
		</database>
	</xsl:template>
	<!-- -->
	<xsl:template match="table[name='exhibits']">
	</xsl:template>
	<!-- -->
	<xsl:template match="table[name='exhibits2']">
	</xsl:template>
Но, конечно, можно эти варианты и смешать - имхо, только путаница тогда
...
Рейтинг: 0 / 0
15.03.2011, 02:21
    #37164850
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите сделать xslt или xquery переобразование с группировкой и обединением
refregНо, конечно, можно эти варианты и смешать - имхо, только путаница тогдаЗависит. Нужно просто четко понимать как работает XSLT-процессор. На конструкции apply-templates формируется список узлов, а затем для каждого узла ищется первый попавшийся шаблон для его обработки. Соответственно, если нужно обработать несколько узлов, а остальные отбросить, то условие лучше писать в apply-templates. Если же узлы нужно обработать по разным правилам, то тогда условие целесообразней писать в match.

В общем нужно найти оптимум между двумя вещами - минимизировать число выборок и минимизировать объем выборок
...
Рейтинг: 0 / 0
15.03.2011, 12:48
    #37165464
yurar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите сделать xslt или xquery переобразование с группировкой и обединением
всеравно я что-то делаю не так
имеем файл
автор<database>
<name>museum</name>
<table>
<name>ob_exhibit</name>
<initialization>
<insert>
<field>
<name>id</name>
<value>6289</value>
</field>
<field>
<name>Name</name>
<value>Богоматір(ікона)</value>
</field>
<field>
<name>Collection_Id</name>
<value>Музика</value>
</field>
<field>
<name>Autor_id</name>
<value># 1</value>
</field>
<field3>
<name>AutorAlias</name>
<value>AutorAlias 1</value>
</field3>
</insert>
<insert>
...
</initialization>
</table>
</database>
надо получить такой
автор<database>
<ob_exhibit>
<row>
<Exhibit_id>6289</Exhibit_id>
<ExhName>Богоматір(ікона)</ExhName>
<ExhCollection>Музика</ExhCollection>
<ExhAutor># 1</ExhAutor>
</row>
...
</ob_exhibit>
<autors>
<row>
<ExhAutor># 1</ExhAutor>
<ExhAutorAlias>AutorAlias 1</ExhAutorAlias>
</row>
...
</autors>
</database>

не могу понять как сделать такое переобразование
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / помогите сделать xslt или xquery переобразование с группировкой и обединением / 25 сообщений из 29, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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