powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.
28 сообщений из 28, показаны все 2 страниц
XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.
    #39820267
Oleg071984
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, Коллеги!
Есть экспортированные данные в виде xml:

Код: xml
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.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
<?xml version="1.0" standalone="yes"?>
<intermech>
  <art id="item_2">
    <relation id="rel_1" elementtype="form" ref="form_1"/>
    <occurrence id="occ_1" ref="item_3" elementtype="art">
      <relation id="rel_2" elementtype="form" ref="form_2"/>
    </occurrence>
    <occurrence id="occ_2" ref="item_4" elementtype="art">
      <relation id="rel_3" elementtype="form" ref="form_3"/>
    </occurrence>	
  </art>
  <form id="form_1">
    <formattribute id="fa_1" name="НАИМ" value="Комплекс 1" parmtype="techcard"/>
    <formattribute id="fa_2" name="VART_ID" value="102532" parmtype="search"/>
    <formattribute id="fa_3" name="ART_ID" value="29503" parmtype="search"/>
    <formattribute id="fa_4" name="Идентификатор версии объекта" value="1" parmtype="search"/>
    <formattribute id="fa_8" name="Наименование" value="Комплекс 1" parmtype="search"/>
    <formattribute id="fa_15" name="ART_VER_ID" value="1" parmtype="search"/>
    <formattribute id="fa_16" name="ART_ID_1" value="102532" parmtype="search"/>
  </form>
  <form id="form_2">
    <formattribute id="fa_20" name="Идентификатор дочернего объекта" value="5817" parmtype="search"/>
    <formattribute id="fa_21" name="Идентификатор родительского объекта" value="102532" parmtype="search"/>
    <formattribute id="fa_22" name="!MANUAL_LINK" value="1" parmtype="search"/>
    <formattribute id="fa_23" name="!CONTEXT" value="2" parmtype="search"/>
  </form>
  <form id="form_3">
    <formattribute id="fa_25" name="Идентификатор дочернего объекта" value="102601" parmtype="search"/>
    <formattribute id="fa_26" name="Идентификатор родительского объекта" value="102532" parmtype="search"/>
    <formattribute id="fa_27" name="!MANUAL_LINK" value="1" parmtype="search"/>
    <formattribute id="fa_28" name="!CONTEXT" value="2" parmtype="search"/>
  </form>
  <art id="item_3">
    <relation id="rel_4" elementtype="form" ref="form_4"/>
  </art>
  <form id="form_4">
    <formattribute id="fa_29" name="НАИМ" value="Запчасть 1" parmtype="techcard"/>
    <formattribute id="fa_30" name="VART_ID" value="5817" parmtype="search"/>
    <formattribute id="fa_31" name="ART_ID" value="29824" parmtype="search"/>
    <formattribute id="fa_36" name="Обозначение" value="Обозначение 1" parmtype="search"/>
    <formattribute id="fa_37" name="Наименование" value="Запчасть 1" parmtype="search"/>
    <formattribute id="fa_44" name="ART_VER_ID" value="1" parmtype="search"/>
    <formattribute id="fa_45" name="ART_ID_1" value="5817" parmtype="search"/>
    <formattribute id="fa_47" name="!PARENT" value="" parmtype="search"/>
    <formattribute id="fa_48" name="!PARENT_ID" value="29503" parmtype="search"/>
  </form>
  <art id="item_4">
    <relation id="rel_5" elementtype="form" ref="form_5"/>
  </art>
  <form id="form_5">
    <formattribute id="fa_49" name="НАИМ" value="Запчасть 2" parmtype="techcard"/>
    <formattribute id="fa_50" name="VART_ID" value="102601" parmtype="search"/>
    <formattribute id="fa_51" name="ART_ID" value="57599" parmtype="search"/>
    <formattribute id="fa_56" name="Обозначение" value="Обозначение 2" parmtype="search"/>
    <formattribute id="fa_57" name="Наименование" value="Запчасть 2" parmtype="search"/>
    <formattribute id="fa_64" name="ART_VER_ID" value="1" parmtype="search"/>
    <formattribute id="fa_65" name="ART_ID_1" value="102601" parmtype="search"/>
    <formattribute id="fa_67" name="!PARENT" value="" parmtype="search"/>
    <formattribute id="fa_68" name="!PARENT_ID" value="29503" parmtype="search"/>
  </form>
</intermech>



Это древовидный список изделий и их комплектующих. В базе данных связь «один-ко-многим».
Файл этот необходимо преобразовать для дальнейшего использования.
Связи между изделиями и комплектующими задаются тегами <relation> и <occurrence>. В <occurrence> задаётся ссылка на параметры дочернего объекта, а <relation> указывает на «коды» дочернего и родительского объектов.
Немного запутано, но не смертельно =)
С XSL ранее не работал и понятия не имел, что это за зверь такой, однако получилось создать вот такой шаблон:
Код: xml
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.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
<?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" indent="yes" />

	<xsl:template match = "/">
		<data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
			<xsl:apply-templates select="intermech/art"/>
		</data>
	</xsl:template>

	<xsl:template match="relation[@elementtype='form']">
		<xsl:variable name="form_id" select="@ref"/>
		<xsl:for-each select = "../occurence">
			<xsl:variable name="item_id" select="@ref"/>		
			<Incidents1>
				<Identifier>
					<xsl:value-of select="@id"/>
				</Identifier>
				<xsl:apply-templates select="../../form[@id=$form_id]"/>
				<xsl:apply-templates select="../../art[@id=$item_id]"/>
			</Incidents1>
		</xsl:for-each>
	</xsl:template>
	
	
	<xsl:template match="form">
		
		<importID>
			<xsl:value-of select="@id"/>
		</importID>
		
		<vartID>
			<xsl:value-of select="formattribute[@name='VART_ID']/@value"/>
		</vartID>
		
		<partName>
			<xsl:value-of select="formattribute[@name='Наименование']/@value"/>
		</partName>
		
		<xsl:if test="formattribute[@name='Идентификатор родительского объекта']">
			<ParentID>
				<xsl:value-of select="formattribute[@name='Идентификатор родительского объекта']/@value"/>
			</ParentID>
		</xsl:if>
		
		<xsl:if test="formattribute[@name='Идентификатор дочернего объекта']">
			<ChildID>
				<xsl:value-of select="formattribute[@name='Идентификатор дочернего объекта']/@value"/>
			</ChildID>
		</xsl:if>
		
	</xsl:template>

	<xsl:template match="art">
	
		<xsl:variable name="form_id" select="relation/@ref"/>
		<xsl:variable name="child_id" select="occurrence/relation/@ref"/>
		
		<Part>
			<xsl:apply-templates select="../form[@id=$form_id]"/>
			<xsl:apply-templates select="../form[@id=$child_id]"/>
		</Part>
			
	</xsl:template>
</xsl:stylesheet>


В результате получается XML:

Результат получает некорректный т.к. в <Part> с <importID>=form_1 не должно быть тегов <ParentID> и <ChildID>.
Корректный результат будет выглядеть так:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<Part>
	<importID>form_1<importID>
	<vartID>102532</vartID>
</Part>
<Part>
	<importID>form_4<importID>
	<ParentID>102532</ParentID>
   	<ChildID>5817</ChildID>
</Part>
<Part>
	<importID>form_5<importID>
	<ParentID>102532</ParentID>
    	<ChildID>102601</ChildID>
</Part>



Архив с файлами во вложении.

Как это сделать не понимаю. Помогите, пожалуйста! =)
...
Рейтинг: 0 / 0
XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.
    #39820347
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg071984Результат получает некорректный т.к. в <Part> с <importID>=form_1 не должно быть тегов <ParentID> и <ChildID>.Их и нет. Они появляются от form_2

Чего вы хотели добиться этим кодом?
Oleg071984
Код: xml
1.
2.
3.
4.
<Part>
  <xsl:apply-templates select="../form[@id=$form_id]"/>
  <xsl:apply-templates select="../form[@id=$child_id]"/>
</Part>

Потому, что по факту получается вот это

Код: xml
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.
<Part>
   <!--form id="form_1"-->
   <importID>form_1</importID>
   <vartID>102532</vartID>
   <partName>Комплекс 1</partName>
   <!--child_id="form_2"-->
   <importID>form_2</importID>
   <vartID>
   </vartID>
   <partName>
   </partName>
   <ParentID>102532</ParentID>
   <ChildID>5817</ChildID>
   <importID>form_3</importID>
   <vartID>
   </vartID>
   <partName>
   </partName>
   <ParentID>102532</ParentID>
   <ChildID>102601</ChildID>
</Part>
<Part>
   <!--form id="form_4"-->
   <importID>form_4</importID>
   <vartID>5817</vartID>
   <partName>Запчасть 1</partName>
   <!--child_id=""-->
</Part>
<Part>
   <!--form id="form_5"-->
   <importID>form_5</importID>
   <vartID>102601</vartID>
   <partName>Запчасть 2</partName>
   <!--child_id=""-->
</Part>



Ну и вот это
Oleg071984
Код: xml
1.
<xsl:value-of select="formattribute[@name='Наименование']/@value"/>

проще записывать так
Код: xml
1.
<xsl:value-of select="formattribute/@Наименование"/>
...
Рейтинг: 0 / 0
XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.
    #39820364
Oleg071984
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,

Опыта работы с XSL - 1 день, поэтому могут быть ошибки.
Мне необходимо из form2 и form3 перекинуть тег "Идентификатор родительского объекта" в form4 и form5. Никак не могу понять как это сделать. Получается только все запихнуть в form1.
Другими словами, form1 состоит из form4 и form5, а связь установлена form1.VART_ID > form4(5).Идентификатор родительского объекта.
Как этого добиться в коде?
...
Рейтинг: 0 / 0
XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.
    #39820391
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так до конца и не понял задачу

Есть набор узлов art
Oleg071984
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
  <art id="item_2">
    <relation id="rel_1" elementtype="form" ref="form_1"/>
    <occurrence id="occ_1" ref="item_3" elementtype="art">
      <relation id="rel_2" elementtype="form" ref="form_2"/>
    </occurrence>
    <occurrence id="occ_2" ref="item_4" elementtype="art">
      <relation id="rel_3" elementtype="form" ref="form_3"/>
    </occurrence>	
  </art>

которые описывают связи между объектам.

Элемент art/relation указывает на основной объект. Элементы art/occurence/relation на дочерние.

Запись
Oleg071984
Код: xml
1.
<relation id="rel_4" elementtype="form" ref="form_4"/>

обозначает, что нужно найти элемент с именем elementtype="form" и id =ref="form_4"

Если все так, то тогда вопрос какие поля нужно достать из главного элемента, а какие из дочерних?
...
Рейтинг: 0 / 0
XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.
    #39820586
Oleg071984
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,

Да верно.

Вот что должно получиться в итоге. Названия полей файла-источника я закомментил
Код: xml
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"?>
<data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Part>
	<importID>form_1</importID> <!-- form/@id -->
	[color=blue]<vartID>102532</vartID>[/color] <!-- formattribute/@VART_ID -->
	<artID>29503</artID> <!-- formattribute/@ART_ID -->
	<partName>Комплекс 1</partName> <!-- formattribute/@Наименование" -->
	<objectVersion>1</objectVersion> <!-- formattribute[@name='Идентификатор версии объекта'] -->
</Part>
<Part>
	<importID>form_4</importID>
    <vartID>5817</vartID>
	<ParentID>102532</ParentID> <!-- formattribute[@name='Идентификатор родительского объекта'] -->
	<artID>29824</artID>
    <partName>Запчасть 1</partName>
	<objectVersion>1</objectVersion>
</Part>
<Part>
	<importID>form_5</importID>
	<vartID>102601</vartID>
	<ParentID>102532</ParentID>
	<artID>57599</artID>
	<partName>Запчасть 2</partName>
	<objectVersion>1</objectVersion>
</Part>
</data>



Во вложении скрин из программы, в которой используются эти данные.
...
Рейтинг: 0 / 0
XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.
    #39820795
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg071984Вот что должно получиться в итоге.Ответа на вопрос_Vasilisk_какие поля нужно достать из главного элемента, а какие из дочерних?я так и не увидел
...
Рейтинг: 0 / 0
XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.
    #39820805
Oleg071984
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поля, которые достаются из главного элемента:
1. "VART_ID"
2. "ART_ID"
3. "Идентификатор версии объекта"
4. "Наименование"

Поля, которые нужно достать из дочерних элементов:
1. "VART_ID"
2. "ART_ID"
3. "Идентификатор версии объекта"
4. "Наименование"
5. "Идентификатор родительского объекта"

Я в прошлом посте написал комменты в коде.
Oleg071984Вот что должно получиться в итоге. Названия полей файла-источника я закомментил
...
Рейтинг: 0 / 0
XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.
    #39820829
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg071984,

И для каждого объекта нужен свой <Part>? Или один <Part> на всю группу?
...
Рейтинг: 0 / 0
XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.
    #39820836
Oleg071984
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,

Да, совершенно верно.
...
Рейтинг: 0 / 0
XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.
    #39820837
Oleg071984
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,

Да. Для каждого объекта нужен свой <Part>.
...
Рейтинг: 0 / 0
XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.
    #39820838
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg071984Да, совершенно верно.Что из этого_Vasilisk_для каждого объекта нужен свой <Part>? Или один <Part> на всю группу?верно? Это два противоречащих друг-другу утверждений
...
Рейтинг: 0 / 0
XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.
    #39820845
Oleg071984
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Oleg071984_Vasilisk_,

Да. Для каждого объекта нужен свой <Part>.
...
Рейтинг: 0 / 0
XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.
    #39820889
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: xml
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.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
<?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" indent="yes" encoding="utf-8" />
  
  <xsl:template match = "/">
    <data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <xsl:apply-templates select="intermech/art"/>
    </data>
  </xsl:template>
  
  <xsl:template match="art">
    <xsl:apply-templates select="relation">
      <xsl:with-param name="is_child" select="0"/>
    </xsl:apply-templates>
    <xsl:apply-templates select="occurrence/relation">
      <xsl:with-param name="is_child" select="1"/>
    </xsl:apply-templates>
  </xsl:template>
  
  <xsl:template match="relation">
    <xsl:param name="is_child"/>
    <xsl:apply-templates select="/intermech/*[
      name() = current()/@elementtype and
      @id = current()/@ref]" mode="items">
      <xsl:with-param name="is_child" select="$is_child"/>
    </xsl:apply-templates>
  </xsl:template>
  
  <xsl:template match="*" mode="items">
    <xsl:param name="is_child"/>
    <Part>
      <importID>
        <xsl:value-of select="@id"/>
      </importID>
      <xsl:apply-templates select="formattribute[@name='VART_ID']" mode="field">
        <xsl:with-param name="elementName" select="'vartID'"/>
      </xsl:apply-templates>
      <xsl:apply-templates select="formattribute[@name='ART_ID']" mode="field">
        <xsl:with-param name="elementName" select="'artID'"/>
      </xsl:apply-templates>
      <xsl:apply-templates select="formattribute[@name='Идентификатор версии объекта']" mode="field">
        <xsl:with-param name="elementName" select="'objectVersion'"/>
      </xsl:apply-templates>
      <xsl:apply-templates select="formattribute[@name='Наименование']" mode="field">
        <xsl:with-param name="elementName" select="'partName'"/>
      </xsl:apply-templates>
      <xsl:if test="$is_child = 1">
        <xsl:apply-templates select="formattribute[@name='Идентификатор родительского объекта']" mode="field">
          <xsl:with-param name="elementName" select="'ParentID'"/>
        </xsl:apply-templates>
      </xsl:if>
    </Part>
  </xsl:template>
  
  <xsl:template match="*" mode="field">
    <xsl:param name="elementName"/>
    <xsl:element name="{$elementName}">
      <xsl:value-of select="@value"/>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

...
Рейтинг: 0 / 0
XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.
    #39821466
Oleg071984
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,

приветствую!

Попробовал сделать конвертацию на сайте https://www.freeformatter.com/xsl-transformer.html.
Результат вот такой:
Код: xml
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.
<data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <Part>
      <importID>form_1</importID>
      <vartID>102532</vartID>
      <artID>29503</artID>
      <objectVersion>1</objectVersion>
      <partName>Комплекс 1</partName>
   </Part>
   <Part>
      <importID>form_2</importID>
      <ParentID>102532</ParentID>
   </Part>
   <Part>
      <importID>form_3</importID>
      <ParentID>102532</ParentID>
   </Part>
   <Part>
      <importID>form_4</importID>
      <vartID>5817</vartID>
      <artID>29824</artID>
      <partName>Запчасть 1</partName>
   </Part>
   <Part>
      <importID>form_5</importID>
      <vartID>102601</vartID>
      <artID>57599</artID>
      <partName>Запчасть 2</partName>
   </Part>
</data>



Почему то ParentID нет в form_4 и form_5.
...
Рейтинг: 0 / 0
XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.
    #39821667
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg071984Почему то ParentID нет в form_4 и form_5.Oleg071984
Код: xml
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.
  <form id="form_4">
    <formattribute id="fa_29" name="НАИМ" value="Запчасть 1" parmtype="techcard"/>
    <formattribute id="fa_30" name="VART_ID" value="5817" parmtype="search"/>
    <formattribute id="fa_31" name="ART_ID" value="29824" parmtype="search"/>
    <formattribute id="fa_36" name="Обозначение" value="Обозначение 1" parmtype="search"/>
    <formattribute id="fa_37" name="Наименование" value="Запчасть 1" parmtype="search"/>
    <formattribute id="fa_44" name="ART_VER_ID" value="1" parmtype="search"/>
    <formattribute id="fa_45" name="ART_ID_1" value="5817" parmtype="search"/>
    <formattribute id="fa_47" name="!PARENT" value="" parmtype="search"/>
    <formattribute id="fa_48" name="!PARENT_ID" value="29503" parmtype="search"/>
  </form>
  <art id="item_4">
    <relation id="rel_5" elementtype="form" ref="form_5"/>
  </art>
  <form id="form_5">
    <formattribute id="fa_49" name="НАИМ" value="Запчасть 2" parmtype="techcard"/>
    <formattribute id="fa_50" name="VART_ID" value="102601" parmtype="search"/>
    <formattribute id="fa_51" name="ART_ID" value="57599" parmtype="search"/>
    <formattribute id="fa_56" name="Обозначение" value="Обозначение 2" parmtype="search"/>
    <formattribute id="fa_57" name="Наименование" value="Запчасть 2" parmtype="search"/>
    <formattribute id="fa_64" name="ART_VER_ID" value="1" parmtype="search"/>
    <formattribute id="fa_65" name="ART_ID_1" value="102601" parmtype="search"/>
    <formattribute id="fa_67" name="!PARENT" value="" parmtype="search"/>
    <formattribute id="fa_68" name="!PARENT_ID" value="29503" parmtype="search"/>
  </form>

Где здесь атрибут
Oleg071984
Код: xml
1.
name="Идентификатор родительского объекта"

?
...
Рейтинг: 0 / 0
XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.
    #39821734
Oleg071984
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,

Он здесь должен появиться после преобразования.
Я же писал в комментариях.
Берутся эти параметры из form_2 и form_3

Oleg071984
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
<Part>
	<importID>form_4</importID>
    <vartID>5817</vartID>
	<ParentID>102532</ParentID> <!-- formattribute[@name='Идентификатор родительского объекта'] -->
	<artID>29824</artID>
    <partName>Запчасть 1</partName>
	<objectVersion>1</objectVersion>
</Part>
...
Рейтинг: 0 / 0
XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.
    #39821736
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Покажите, где здесь
Oleg071984
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  <form id="form_4">
    <formattribute id="fa_29" name="НАИМ" value="Запчасть 1" parmtype="techcard"/>
    <formattribute id="fa_30" name="VART_ID" value="5817" parmtype="search"/>
    <formattribute id="fa_31" name="ART_ID" value="29824" parmtype="search"/>
    <formattribute id="fa_36" name="Обозначение" value="Обозначение 1" parmtype="search"/>
    <formattribute id="fa_37" name="Наименование" value="Запчасть 1" parmtype="search"/>
    <formattribute id="fa_44" name="ART_VER_ID" value="1" parmtype="search"/>
    <formattribute id="fa_45" name="ART_ID_1" value="5817" parmtype="search"/>
    <formattribute id="fa_47" name="!PARENT" value="" parmtype="search"/>
    <formattribute id="fa_48" name="!PARENT_ID" value="29503" parmtype="search"/>
  </form>

атрибутOleg071984
Код: xml
1.
<!-- formattribute[@name='Идентификатор родительского объекта'] -->
...
Рейтинг: 0 / 0
XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.
    #39821744
Oleg071984
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,

В этом фрагменте нет. И...?
...
Рейтинг: 0 / 0
XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.
    #39821754
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg071984В этом фрагменте нет. И...?Если в form_4 нет атрибута 'Идентификатор родительского объекта' то тогда откуда ему взяться в выходном файле? Если значение элемента ParentID должно браться именно из этого атрибута?
...
Рейтинг: 0 / 0
XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.
    #39821771
Oleg071984
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,
Я думаю, что его можно взять из:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<form id="form_2">
    <formattribute id="fa_20" name="Идентификатор дочернего объекта" value="5817" parmtype="search"/>
    <formattribute id="fa_21" name="Идентификатор родительского объекта" value="102532" parmtype="search"/>
    <formattribute id="fa_22" name="!MANUAL_LINK" value="1" parmtype="search"/>
    <formattribute id="fa_23" name="!CONTEXT" value="2" parmtype="search"/>
  </form>
  <form id="form_3">
    <formattribute id="fa_25" name="Идентификатор дочернего объекта" value="102601" parmtype="search"/>
    <formattribute id="fa_26" name="Идентификатор родительского объекта" value="102532" parmtype="search"/>
    <formattribute id="fa_27" name="!MANUAL_LINK" value="1" parmtype="search"/>
    <formattribute id="fa_28" name="!CONTEXT" value="2" parmtype="search"/>
  </form>
...
Рейтинг: 0 / 0
XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.
    #39821790
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg071984Я думаюВы можете много чего думать. Я мысли читать не умею
Oleg071984его можно взять из:Из какого из восьми атрибутов.

Если хотите нужный результат - внятно сформулируйте требования. И постарайтесь их не менять
...
Рейтинг: 0 / 0
XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.
    #39821801
Oleg071984
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,

Согласен, могу. Так вот чтобы исключить возможное непонимание я специально привёл конечный результат XML с комментариями. И потом ещё обсудил какие поля откуда брать.
Предлагаю конструктивно подойти к вопросу.
...
Рейтинг: 0 / 0
XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.
    #39821836
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg071984я специально привёл конечный результат XML с комментариямиМой код ему полностью соответствует
...
Рейтинг: 0 / 0
XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.
    #39821867
Oleg071984
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,
В приведённом мной конечном результате:
1. Значения полей parentID взяты из form2 и form3 и добавлены в form4 и form5 в соответствии с заданным relation и occurence.
2. Form2 и Form3 отсутствуют.

Результат работы Вашего кода не решает проблему.

Вот зачем спорить? Я уверен, что с Вашими навыками в XSL изменения внести 10 минут времени.
...
Рейтинг: 0 / 0
XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.
    #39822324
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg071984Я уверен, что с Вашими навыками в XSL изменения внести 10 минут времени.Да. Если я пойму, что вам нужно. Сейчас я не понимаю. Вообще
Oleg0719842. Form2 и Form3 отсутствуют.Почему они должны отсутствовать?
Oleg071984
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
  <art id="item_2">
    <relation id="rel_1" elementtype="form" ref="form_1"/>
    <occurrence id="occ_1" ref="item_3" elementtype="art">
      <relation id="rel_2" elementtype="form" ref="form_2"/>
    </occurrence>
    <occurrence id="occ_2" ref="item_4" elementtype="art">
      <relation id="rel_3" elementtype="form" ref="form_3"/>
    </occurrence>	
  </art>

Oleg071984Для каждого объекта нужен свой <Part>.
...
Рейтинг: 0 / 0
XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.
    #39822369
Oleg071984
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ок. Чуть позже.
...
Рейтинг: 0 / 0
XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.
    #39822380
Oleg071984
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Благодарю за понимание. Сегодня чуть позже все подробно объясню.
...
Рейтинг: 0 / 0
XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.
    #39822552
Oleg071984
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,

_Vasilisk_,

_Vasilisk_Да. Если я пойму, что вам нужно. Сейчас я не понимаю. Вообще


Ок. Не вопрос. Смотрим на xml-источник. Структура не логичная, но в ней можно разобраться.
В нашем конкретном случае в теге <art> содержится структура изделия "Комплекс 1".

1. Принцип построения иерархии:
"Комплекс 1" состоит из "Запчасть 1" и "Запчасть 2", т.е. является им родительским объектом.

Справедливо и обратное - "Запчасть 1" и "Запчасть 2" входят в "Комплекс 1", т.е. являются дочерними объектами.


2. Первый элемент <relation>.
Первый элемент -
Код: xml
1.
<relation id="rel_1" elementtype="form" ref="form_1"/>

задает ссылку на технические параметры главного элемента "Комплекс 1", а именно:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
<form id="form_1">
    <formattribute id="fa_1" name="НАИМ" value="Комплекс 1" parmtype="techcard"/>
    <formattribute id="fa_2" name="VART_ID" value="102532" parmtype="search"/>
    <formattribute id="fa_3" name="ART_ID" value="29503" parmtype="search"/>
    <formattribute id="fa_4" name="Идентификатор версии объекта" value="1" parmtype="search"/>
    <formattribute id="fa_8" name="Наименование" value="Комплекс 1" parmtype="search"/>
    <formattribute id="fa_15" name="ART_VER_ID" value="1" parmtype="search"/>
    <formattribute id="fa_16" name="ART_ID_1" value="102532" parmtype="search"/>
  </form>



Дальше все интересней.

3. Элемент <occurrence>.
Служит для хранения ссылки @ref на элементы <item>, которые в свою очередь содержат ссылки на технические параметры "Запчасти 1" и "Запчасти 2", а именно <form_4> и <form_5>.

4. Элемент <occurrence>/<relation>
Хранит ссылки на form_2 и form_3. Эти элементы хранят информацию о связях.
У каждого элемента иерархии есть тег <VART_ID>, который является уникальным ключом.
В <form_2> и <form_3> есть параметр:
Код: xml
1.
<formattribute id="fa_21" name="Идентификатор родительского объекта" value="102532" parmtype="search"/>


@value которого совпадает с <VART_ID> родительского элемента.
Т.е. <VART_ID> "Комплекс_1" будет равен formattribute[@name='Идентификатор родительского объекта']/@value" у <form_2> и <form_3>.

5. Итог
<form_2> и <form_3> хранят информацию о связях элементов в сборке, поэтому они нам нужны только когда будет работать XSL. В итоговом XML они не нужны.
Мы просто берем файл-источник и преобразовываем его структуру в логичную и понятную.
В примере итогового xml:
Код: xml
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"?>
<data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Part>
	<importID>form_1</importID> <!-- form/@id -->
	<vartID>102532</vartID> <!-- formattribute/@VART_ID -->
	<artID>29503</artID> <!-- formattribute/@ART_ID -->
	<partName>Комплекс 1</partName> <!-- formattribute/@Наименование" -->
	<objectVersion>1</objectVersion> <!-- formattribute[@name='Идентификатор версии объекта'] -->
</Part>
<Part>
	<importID>form_4</importID>
    <vartID>5817</vartID>
	<ParentID>102532</ParentID> <!-- formattribute[@name='Идентификатор родительского объекта'] -->
	<artID>29824</artID>
    <partName>Запчасть 1</partName>
	<objectVersion>1</objectVersion>
</Part>
<Part>
	<importID>form_5</importID>
	<vartID>102601</vartID>
	<ParentID>102532</ParentID>
	<artID>57599</artID>
	<partName>Запчасть 2</partName>
	<objectVersion>1</objectVersion>
</Part>
</data>



те же самые данные но в более понятном виде.
Смотрим на Part/ImportID=form_1. VART_ID= 102532 . Он будет равен <ParentID> для Part/ImportID=form_4 и Part/ImportID=form_5. Просто и понятно.

6. Для чего все это?
ERP-система, в которую мне необходимо залить данные, не понимает мудреный формат исходного XML.

Надеюсь, что понятно рассказал =) Жду вопросов! Можно вот сюда: oleg071984@gmail.com. В этом случае я смогу отвечать сразу же.
...
Рейтинг: 0 / 0
28 сообщений из 28, показаны все 2 страниц
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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