powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / помогите сделать xslt или xquery переобразование с группировкой и обединением
25 сообщений из 29, страница 1 из 2
помогите сделать xslt или xquery переобразование с группировкой и обединением
    #37160628
yurar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здраствуйте, проблема вот в чем: надо переобразовать 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
помогите сделать xslt или xquery переобразование с группировкой и обединением
    #37160906
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
помогите сделать xslt или xquery переобразование с группировкой и обединением
    #37160979
yurar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
большое спасибо, все работает
...
Рейтинг: 0 / 0
помогите сделать xslt или xquery переобразование с группировкой и обединением
    #37161029
yurar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а как сделать такое преобразование:
имеем файл
автор<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
помогите сделать xslt или xquery переобразование с группировкой и обединением
    #37161039
yurar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот написал такой код
автор<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
помогите сделать xslt или xquery переобразование с группировкой и обединением
    #37161058
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
помогите сделать xslt или xquery переобразование с группировкой и обединением
    #37161504
yurar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
помогите сделать xslt или xquery переобразование с группировкой и обединением
    #37161534
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yurar,

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

исправил, но результат также <database/>
...
Рейтинг: 0 / 0
помогите сделать xslt или xquery переобразование с группировкой и обединением
    #37161587
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это что за конструкция? У тя в 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
помогите сделать xslt или xquery переобразование с группировкой и обединением
    #37161709
yurar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
refreg, спасибо
извиняюсь за столь глупую ошибку, я только недавно начал расбиратся с XSLT

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

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

Подозреваю, что условие должно быть такое:
Код: plaintext
<xsl:if test="@id=$var2/@id">
Ну, и еще, что касается логики объединения двух файлов, либо второй файл надо крутить в цикле для каждого элемента первого файла, либо создавать по нему ключ, и искать по ключу. Если в каждом файле по одной строке - этого не понять...
...
Рейтинг: 0 / 0
помогите сделать xslt или xquery переобразование с группировкой и обединением
    #37162507
yurar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
помогите сделать xslt или xquery переобразование с группировкой и обединением
    #37162540
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
помогите сделать xslt или xquery переобразование с группировкой и обединением
    #37162552
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но лучше так, в примере выше просто показано, в чем ошибки:
Код: 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
помогите сделать xslt или xquery переобразование с группировкой и обединением
    #37162553
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, и еще, если материал надо текстом, то так:
Код: plaintext
<xsl:value-of select="key('table2',id)/Material_id"/>
...
Рейтинг: 0 / 0
помогите сделать xslt или xquery переобразование с группировкой и обединением
    #37162613
yurar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
refreg, большое спасибо. теперь уже понял как использовать ключи
...
Рейтинг: 0 / 0
помогите сделать xslt или xquery переобразование с группировкой и обединением
    #37162682
yurar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
для заданого файла
автор<database>
<name>museum</name>
<table>
<name>exhibits</name>
...
</table>
<table>
<name>Autors</name>
...
<.table>

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

Код: plaintext
select="/database/table[name='exhibits']"
...
Рейтинг: 0 / 0
помогите сделать xslt или xquery переобразование с группировкой и обединением
    #37164646
yurar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
помогите сделать xslt или xquery переобразование с группировкой и обединением
    #37164749
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так правильно:
Код: 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
помогите сделать xslt или xquery переобразование с группировкой и обединением
    #37164768
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refregА если несколько обработок нужно для table , используется атрибут mode И чем это лучше, чем список шаблонов с разным match?
...
Рейтинг: 0 / 0
помогите сделать xslt или xquery переобразование с группировкой и обединением
    #37164810
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_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
помогите сделать xslt или xquery переобразование с группировкой и обединением
    #37164850
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refregНо, конечно, можно эти варианты и смешать - имхо, только путаница тогдаЗависит. Нужно просто четко понимать как работает XSLT-процессор. На конструкции apply-templates формируется список узлов, а затем для каждого узла ищется первый попавшийся шаблон для его обработки. Соответственно, если нужно обработать несколько узлов, а остальные отбросить, то условие лучше писать в apply-templates. Если же узлы нужно обработать по разным правилам, то тогда условие целесообразней писать в match.

В общем нужно найти оптимум между двумя вещами - минимизировать число выборок и минимизировать объем выборок
...
Рейтинг: 0 / 0
помогите сделать xslt или xquery переобразование с группировкой и обединением
    #37165464
yurar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
всеравно я что-то делаю не так
имеем файл
автор<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
25 сообщений из 29, страница 1 из 2
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / помогите сделать xslt или xquery переобразование с группировкой и обединением
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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