у вас же всегда есть возможность один и тот же кусок xml обработать 2 и более количество раз.
Например, покажу подобную реализацию, на примере вызова макроса вывода фоток из альбома
<xsl:apply-templates select="document('udata://photoalbum/album/(/butterfly/)')/udata" />
пишем для данного вызова обработчик который 2 раза пробегает по полученному списку фотографий и выводит ul список с ссылками на каждую фото и div блоки с самими фотками
<xsl:template match="udata[@module = 'photoalbum' and @method = 'album']" />
<xsl:template match="udata[@module = 'photoalbum' and @method = 'album'][total]" >
<xsl:apply-templates select="." mode="div" />
<xsl:apply-templates select="." mode="ul" />
</xsl:template>
<!-- ul -->
<xsl:template match="udata[@module = 'photoalbum'][@method = 'album'][total]" mode="ul">
<ul>
<xsl:apply-templates select="items/item" mode="ul" />
</ul>
</xsl:template>
<xsl:template match="item" mode="ul">
<li >
<a href="{@link}">
<xsl:value-of select="position()"/>
</a>
</li>
</xsl:template>
<!-- \ul -->
<!-- div -->
<xsl:template match="udata[@module = 'photoalbum'][@method = 'album'][total]" mode="div">
<div>
<xsl:apply-templates select="items/item" mode="div" />
</div>
</xsl:template>
<xsl:template match="item" mode="div">
<xsl:apply-templates select="document(concat('upage://',@id))/udata/page" mode="div" />
</xsl:template>
<xsl:template match="page" mode="div">
<a href="{//property[@name='ssylka']/value}" >
<xsl:call-template name="catalog-thumbnail">
<xsl:with-param name="element-id" select="@id" />
<xsl:with-param name="field-name">photo</xsl:with-param>
<xsl:with-param name="width">auto</xsl:with-param>
<xsl:with-param name="height">323</xsl:with-param>
</xsl:call-template>
</a>
</xsl:template>
<!-- \div -->
В итоге, мы 2 раза обработали один и тот же xml
Вынес создание объектов до страниц, теперь другая ошибка)
Вот как было сделано:
<!-- Предложения -->
<xsl:template match="ПакетПредложений">
<meta>
<source-name>commerceML2</source-name>
</meta>
<objects>
<xsl:apply-templates select="Предложения/Предложение" mode="objects"/>
</objects>
<pages>
<xsl:apply-templates select="Предложения/Предложение" mode="items"/>
</pages>
</xsl:template>
<!-- описание объектов справочников -->
<xsl:template match="Предложения/Предложение" mode="objects">
<object id="{substring-after(Ид,'#')}" name="{Наименование}" type-id="288">
<properties>
<group name="varianty_harakteristik_kolgotok">
<xsl:apply-templates select="ХарактеристикиТовара/ХарактеристикаТовара[Наименование = 'Колготки цвета']" mode="color" />
<xsl:apply-templates select="ХарактеристикиТовара/ХарактеристикаТовара[Наименование = 'Модель']" mode="model" />
<xsl:apply-templates select="ХарактеристикиТовара/ХарактеристикаТовара[Наименование = 'Размер']" mode="size" />
<xsl:apply-templates select="ХарактеристикиТовара/ХарактеристикаТовара[Наименование = 'Бренд']" mode="brand" />
<xsl:apply-templates select="ХарактеристикиТовара/ХарактеристикаТовара[Наименование = 'Плотность']" mode="density" />
</group>
</properties>
</object>
</xsl:template>
<xsl:template match="ХарактеристикиТовара/ХарактеристикаТовара" mode="color" >
<property name="color" type="string" is-public="1" visible="visible">
<title><xsl:value-of select="Наименование" /></title>
<value><xsl:value-of select="Значение" /></value>
</property>
</xsl:template>
....
<!-- описание страниц, ссылающихся на эти объекты -->
<xsl:template match="Предложения/Предложение" mode="items">
<page id="{substring-before(Ид,'#')}" update-only="1">
<properties>
<group name="optioned_properties" title="Опционные свойства">
<property name="Характеристики" type="optioned" multiple="multiple" is-public="1" visible="visible" allow-runtime-add="1">
<type data-type="optioned" />
<title>Характеристики</title>
<value>
<option int="{Количество}" float="{Цены/Цена/ЦенаЗаЕдиницу}">
<object id="{substring-after(Ид,'#')}" name="{Наименование}" type-id="288" />
</option>
</value>
</property>
</group>
</properties>
</page>
</xsl:template>
То есть в начале задаются объекты, а затем уже товары ссылаются на эти объекты.
В преобразованном в UmiDump XML-нике тоже вроде все красиво:
<objects>
<object id="ab54bcb0-df9b-11e1-82b1-001e8cd2c7e0" name="Trasparenze Sophie (Trasparenze Sophie Cina (синий) 1)" type-id="288">
<properties>
<group name="varianty_harakteristik_kolgotok">
<property name="color" type="string" is-public="1" visible="visible">
<title>Колготки цвета</title>
<value><![CDATA[ Cina (синий)]]></value>
</property>
...
</properties>
</object>
...
</objects>
<pages>
<page id="ab54bcaf-df9b-11e1-82b1-001e8cd2c7e0" update-only="1">
<properties>
<group name="optioned_properties" title="Опционные свойства">
<property name="Характеристики" type="optioned" multiple="multiple" is-public="1" visible="visible" allow-runtime-add="1">
<type data-type="optioned"/>
<title>Характеристики</title>
<value>
<option int="7" float="650.00">
<object id="ab54bcb0-df9b-11e1-82b1-001e8cd2c7e0" name="Trasparenze Sophie (Trasparenze Sophie Cina (синий) 1)" type-id="288"/>
</option>
</value>
</property>
</group>
</properties>
</page>
...
Но теперь импорт выдает ошибки вида:
невозможно импортировать объект "Conte Prisrige12 (Conte Prestige12 Bronz (оттенок загара) 2)" (#ab54bc86-df9b-11e1-82b1-001e8cd2c7e0): невозможно определить тип данных #288
288 - это созданный предварительно мной справочник "Варианты характеристик", тип с таким id есть. Почему система не может его найти?
Это не так, ID разные, хотя и кажется что похожие. 1С присылает характеристики товара в виде
<Предложение>
<Ид>ab54bc85-df9b-11e1-82b1-001e8cd2c7e0#ab54bc86-df9b-11e1-82b1-001e8cd2c7e0</Ид>
Где до # идет id товара (под этим id) товары идут в import.xml, а после # идет id характеристики. Они хоть внешне похожие, но значения у них разные, если присмотреться....
Создание объектов я победил, добавив секцию <types> :
<!-- Предложения -->
<xsl:template match="ПакетПредложений">
<meta>
<source-name>commerceML2</source-name>
</meta>
<types>
<!-- описание типа для справочника вариантов характеристик колготок -->
<type id="charakteristics-kinds" title="Варианты характеристик колготок" parent-id="1" guide="guide">
<fieldgroups>
<group name="varianty_harakteristik_kolgotok">
<field name="color" title="Цвет" field-type-id="3" >
<type id="3" name="Строка" data-type="string"/>
</field>
...
</group>
</fieldgroups>
</type>
</types>
<objects>
<xsl:apply-templates select="Предложения/Предложение" mode="objects"/>
..
и соответственно указав тип charakteristics-kinds при создании объекта:
<xsl:template match="Предложения/Предложение" mode="objects">
<object id="{substring-after(Ид,'#')}" name="{Наименование}" type-id="charakteristics-kinds">
<properties>
а также при задании опционного свойства
<property name="Характеристики" type="optioned" is-public="1" visible="visible" allow-runtime-add="1">
<type data-type="optioned" />
<title>Характеристики</title>
<value>
<option int="{Количество}" float="{Цены/Цена/ЦенаЗаЕдиницу}">
<object id="{substring-after(Ид,'#')}" name="{Наименование}" type-id="charakteristics-kinds" />
</option>
</value>
</property>
Что происходит теперь: справочник "Варианты характеристик колготок" создается, данные туда добавляются. В типе данных для товара создается поле "Характеристики". Но оно оказывается пустым :( мало того, у него не задан даже тип данных (когда смотришь редактирование поля, в выпадающем списке "тип данных" ничего не выбрано). Единственное что там выбрано - это справочник "Варианты характеристик колготок". Получается, что где-то есть ошибка в задании property товара? Не пойму в чем дело, по синтаксису все похоже как в примере...
Во вложении находится измененный шаблон импорта commerceML2.xsl
Что удалось сделать:
- Создан тип данных - справочник "Варианты характеристик колготок"
- Задан единый тип товара - "1C: Колготки" (до этого пыталось на каждую группу создать свой тип товара)
- В этом типе товара определено опционное свойство "Характеристики", которое должно ссылаться на этот справочник
- Предложения с характеристиками товара парсятся теперь два раза:
1. формируется секция <objects>, в которой происходит наполнение справочника "Варианты характеристик колготок"
2. формируется секция <pages>, в которую в опционные свойства должны записываться ссылки на созданные объекты справочника.
Что не получилось:
- справочник "Варианты характеристик колготок" формируется не в разделе "Справочники", а в корневом разделе "Шаблоны данных", хотя в описании типа указано:
<type id="charakteristics-kinds" title="Варианты характеристик колготок" parent-id="{root-guides-type}" guide="guide">
- опционное поле у товара формируется со ссылкой не на справочник "Варианты характеристик колготок", а на какой-то другой справочник "Справочник для поля "Характеристики"" (?), который видимо создается как-то автоматически, хотя в описании опционного поля явно прописано:
<field name="charakteristics" title="Характеристики" visible="visible" guide-id="charakteristics-kinds">
<type name="Составное" data-type="optioned" multiple="multiple" />
</field>
Соответственно при добавлении товаров, хотя сами характеристики и добавляются в справочник, в самих товарах поле "Характеристики" оказывается не заполненным...
Поэтому если возможно помогите разобраться в следующих вопросах:
1. Как сформировать справочник справочник в разделе данных "Справочники", а не в корневом разделе "Шаблоны данных"?
2. Как заставить создаваться опционное поле со ссылкой на мой справочник, а не на какой-то Справочник для поля "Характеристики"?
то, что в товарах оказывается незаполненным поле, может быть следствием пункта 2.