Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / XML, XSL, XPath, XQuery Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.  [new]
Oleg071984
Member

Откуда: СПБ, Россия
Сообщений: 16
Добрый день, Коллеги!
Есть экспортированные данные в виде xml:

<?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 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>.
Корректный результат будет выглядеть так:
<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>


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

Как это сделать не понимаю. Помогите, пожалуйста! =)

К сообщению приложен файл (quest.7z - 1Kb) cкачать
30 май 19, 11:43    [21897570]     Ответить | Цитировать Сообщить модератору
 Re: XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11255
Oleg071984
Результат получает некорректный т.к. в <Part> с <importID>=form_1 не должно быть тегов <ParentID> и <ChildID>.
Их и нет. Они появляются от form_2

Чего вы хотели добиться этим кодом?
Oleg071984
<Part>
  <xsl:apply-templates select="../form[@id=$form_id]"/>
  <xsl:apply-templates select="../form[@id=$child_id]"/>
</Part>
Потому, что по факту получается вот это

+
<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
<xsl:value-of select="formattribute[@name='Наименование']/@value"/>
проще записывать так
<xsl:value-of select="formattribute/@Наименование"/>
30 май 19, 15:06    [21897745]     Ответить | Цитировать Сообщить модератору
 Re: XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.  [new]
Oleg071984
Member

Откуда: СПБ, Россия
Сообщений: 16
_Vasilisk_,

Опыта работы с XSL - 1 день, поэтому могут быть ошибки.
Мне необходимо из form2 и form3 перекинуть тег "Идентификатор родительского объекта" в form4 и form5. Никак не могу понять как это сделать. Получается только все запихнуть в form1.
Другими словами, form1 состоит из form4 и form5, а связь установлена form1.VART_ID > form4(5).Идентификатор родительского объекта.
Как этого добиться в коде?
30 май 19, 15:35    [21897778]     Ответить | Цитировать Сообщить модератору
 Re: XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11255
Я так до конца и не понял задачу

Есть набор узлов art
Oleg071984
  <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
<relation id="rel_4" elementtype="form" ref="form_4"/>
обозначает, что нужно найти элемент с именем elementtype="form" и id =ref="form_4"

Если все так, то тогда вопрос какие поля нужно достать из главного элемента, а какие из дочерних?
30 май 19, 16:19    [21897825]     Ответить | Цитировать Сообщить модератору
 Re: XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.  [new]
Oleg071984
Member

Откуда: СПБ, Россия
Сообщений: 16
_Vasilisk_,

Да верно.

Вот что должно получиться в итоге. Названия полей файла-источника я закомментил
<?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>


Во вложении скрин из программы, в которой используются эти данные.

К сообщению приложен файл. Размер - 2Kb
31 май 19, 09:53    [21898272]     Ответить | Цитировать Сообщить модератору
 Re: XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11255
Oleg071984
Вот что должно получиться в итоге.
Ответа на вопрос
_Vasilisk_
какие поля нужно достать из главного элемента, а какие из дочерних?
я так и не увидел
31 май 19, 14:44    [21898828]     Ответить | Цитировать Сообщить модератору
 Re: XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.  [new]
Oleg071984
Member

Откуда: СПБ, Россия
Сообщений: 16
Поля, которые достаются из главного элемента:
1. "VART_ID"
2. "ART_ID"
3. "Идентификатор версии объекта"
4. "Наименование"

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

Я в прошлом посте написал комменты в коде.
Oleg071984
Вот что должно получиться в итоге. Названия полей файла-источника я закомментил
31 май 19, 15:04    [21898843]     Ответить | Цитировать Сообщить модератору
 Re: XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11255
Oleg071984,

И для каждого объекта нужен свой <Part>? Или один <Part> на всю группу?
31 май 19, 15:33    [21898878]     Ответить | Цитировать Сообщить модератору
 Re: XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.  [new]
Oleg071984
Member

Откуда: СПБ, Россия
Сообщений: 16
_Vasilisk_,

Да, совершенно верно.
31 май 19, 15:40    [21898889]     Ответить | Цитировать Сообщить модератору
 Re: XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.  [new]
Oleg071984
Member

Откуда: СПБ, Россия
Сообщений: 16
_Vasilisk_,

Да. Для каждого объекта нужен свой <Part>.
31 май 19, 15:42    [21898892]     Ответить | Цитировать Сообщить модератору
 Re: XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11255
Oleg071984
Да, совершенно верно.
Что из этого
_Vasilisk_
для каждого объекта нужен свой <Part>? Или один <Part> на всю группу?
верно? Это два противоречащих друг-другу утверждений
31 май 19, 15:43    [21898893]     Ответить | Цитировать Сообщить модератору
 Re: XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.  [new]
Oleg071984
Member

Откуда: СПБ, Россия
Сообщений: 16
Oleg071984
_Vasilisk_,

Да. Для каждого объекта нужен свой <Part>.
31 май 19, 15:46    [21898902]     Ответить | Цитировать Сообщить модератору
 Re: XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11255
+
<?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>
31 май 19, 16:56    [21898984]     Ответить | Цитировать Сообщить модератору
 Re: XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.  [new]
Oleg071984
Member

Откуда: СПБ, Россия
Сообщений: 16
_Vasilisk_,

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

Попробовал сделать конвертацию на сайте https://www.freeformatter.com/xsl-transformer.html.
Результат вот такой:
<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.
3 июн 19, 08:47    [21900093]     Ответить | Цитировать Сообщить модератору
 Re: XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11255
Oleg071984
Почему то ParentID нет в form_4 и form_5.
Oleg071984
  <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
name="Идентификатор родительского объекта"
?
3 июн 19, 13:58    [21900481]     Ответить | Цитировать Сообщить модератору
 Re: XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.  [new]
Oleg071984
Member

Откуда: СПБ, Россия
Сообщений: 16
_Vasilisk_,

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

Oleg071984
<Part>
	<importID>form_4</importID>
    <vartID>5817</vartID>
	<ParentID>102532</ParentID> <!-- formattribute[@name='Идентификатор родительского объекта'] -->
	<artID>29824</artID>
    <partName>Запчасть 1</partName>
	<objectVersion>1</objectVersion>
</Part>

3 июн 19, 15:04    [21900578]     Ответить | Цитировать Сообщить модератору
 Re: XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11255
Покажите, где здесь
Oleg071984
  <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
<!-- formattribute[@name='Идентификатор родительского объекта'] -->
3 июн 19, 15:07    [21900582]     Ответить | Цитировать Сообщить модератору
 Re: XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.  [new]
Oleg071984
Member

Откуда: СПБ, Россия
Сообщений: 16
_Vasilisk_,

В этом фрагменте нет. И...?
3 июн 19, 15:16    [21900596]     Ответить | Цитировать Сообщить модератору
 Re: XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11255
Oleg071984
В этом фрагменте нет. И...?
Если в form_4 нет атрибута 'Идентификатор родительского объекта' то тогда откуда ему взяться в выходном файле? Если значение элемента ParentID должно браться именно из этого атрибута?
3 июн 19, 15:33    [21900611]     Ответить | Цитировать Сообщить модератору
 Re: XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.  [new]
Oleg071984
Member

Откуда: СПБ, Россия
Сообщений: 16
_Vasilisk_,
Я думаю, что его можно взять из:
<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>
3 июн 19, 15:49    [21900632]     Ответить | Цитировать Сообщить модератору
 Re: XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11255
Oleg071984
Я думаю
Вы можете много чего думать. Я мысли читать не умею
Oleg071984
его можно взять из:
Из какого из восьми атрибутов.

Если хотите нужный результат - внятно сформулируйте требования. И постарайтесь их не менять
3 июн 19, 16:03    [21900655]     Ответить | Цитировать Сообщить модератору
 Re: XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.  [new]
Oleg071984
Member

Откуда: СПБ, Россия
Сообщений: 16
_Vasilisk_,

Согласен, могу. Так вот чтобы исключить возможное непонимание я специально привёл конечный результат XML с комментариями. И потом ещё обсудил какие поля откуда брать.
Предлагаю конструктивно подойти к вопросу.
3 июн 19, 16:12    [21900669]     Ответить | Цитировать Сообщить модератору
 Re: XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11255
Oleg071984
я специально привёл конечный результат XML с комментариями
Мой код ему полностью соответствует
3 июн 19, 16:44    [21900708]     Ответить | Цитировать Сообщить модератору
 Re: XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.  [new]
Oleg071984
Member

Откуда: СПБ, Россия
Сообщений: 16
_Vasilisk_,
В приведённом мной конечном результате:
1. Значения полей parentID взяты из form2 и form3 и добавлены в form4 и form5 в соответствии с заданным relation и occurence.
2. Form2 и Form3 отсутствуют.

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

Вот зачем спорить? Я уверен, что с Вашими навыками в XSL изменения внести 10 минут времени.
3 июн 19, 17:47    [21900754]     Ответить | Цитировать Сообщить модератору
 Re: XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11255
Oleg071984
Я уверен, что с Вашими навыками в XSL изменения внести 10 минут времени.
Да. Если я пойму, что вам нужно. Сейчас я не понимаю. Вообще
Oleg071984
2. Form2 и Form3 отсутствуют.
Почему они должны отсутствовать?
Oleg071984
  <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>.
4 июн 19, 14:45    [21901582]     Ответить | Цитировать Сообщить модератору
 Re: XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.  [new]
Oleg071984
Member

Откуда: СПБ, Россия
Сообщений: 16
Ок. Чуть позже.
4 июн 19, 16:15    [21901669]     Ответить | Цитировать Сообщить модератору
 Re: XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.  [new]
Oleg071984
Member

Откуда: СПБ, Россия
Сообщений: 16
Благодарю за понимание. Сегодня чуть позже все подробно объясню.
4 июн 19, 16:31    [21901686]     Ответить | Цитировать Сообщить модератору
 Re: XSLT. Преобразование XML-XML с учетом отношения один-ко-многим.  [new]
Oleg071984
Member

Откуда: СПБ, Россия
Сообщений: 16
_Vasilisk_,

_Vasilisk_,

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



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

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


    2. Первый элемент <relation>.
    Первый элемент -
    <relation id="rel_1" elementtype="form" ref="form_1"/>
    
    задает ссылку на технические параметры главного элемента "Комплекс 1", а именно:
    <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> есть параметр:
    <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 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. В этом случае я смогу отвечать сразу же.
  • 4 июн 19, 22:20    [21901985]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: 1 2      [все]
    Все форумы / XML, XSL, XPath, XQuery Ответить