Изменение иерархии при обмене данными с 1С — различия между версиями
Mad grant (обсуждение | вклад) |
|||
(не показано 5 промежуточных версий 2 участников) | |||
Строка 1: | Строка 1: | ||
+ | '''В статье [[Как_переместить_страницу_если_её_раздел_поменялся]] есть более простое решение''' | ||
+ | |||
При импорте из CommerceML2.0 объекты располагаются в том иерархическом порядке, в котором они были в исходном файле, в дальнейшем, при обновлении данных средствами импорта их положение уже не изменяется, а обращение к объекту идёт напрямую по его идентификатору. Если требуется при обмене данными с 1С изменять иерархию в соответствии с импортируемыми данными, то необходимо добавить соответствующую обработку в шаблон импорт.<br /> | При импорте из CommerceML2.0 объекты располагаются в том иерархическом порядке, в котором они были в исходном файле, в дальнейшем, при обновлении данных средствами импорта их положение уже не изменяется, а обращение к объекту идёт напрямую по его идентификатору. Если требуется при обмене данными с 1С изменять иерархию в соответствии с импортируемыми данными, то необходимо добавить соответствующую обработку в шаблон импорт.<br /> | ||
− | Перед импортом входящая информация из commerceML2.0 трансформируется по XSLT шаблону в формат UmiDump2.0. За иерархические связи в UmiDump отвечает нода <hierarchy>. Для того чтобы при импорте структура каталога обновлялась, необходимо чтобы после трансформации в UmiDump в нём | + | Перед импортом входящая информация из commerceML2.0 трансформируется по XSLT шаблону в формат UmiDump2.0. За иерархические связи в UmiDump отвечает нода <hierarchy>. Для того чтобы при импорте структура каталога обновлялась, необходимо чтобы после трансформации в UmiDump в нём были записи об иерархических связях. Для этого скопируем содержимое файла ~/xsl/import/commerceML2.xsl в ~/xsl/import/custom/commerceML2.xsl удалив строку <xsl:include href="custom/commerceML2.xsl" />. |
После этого находим шаблон | После этого находим шаблон | ||
<source lang=xml> | <source lang=xml> | ||
Строка 25: | Строка 27: | ||
<xsl:apply-templates select="КоммерческаяИнформация/Классификатор" /> | <xsl:apply-templates select="КоммерческаяИнформация/Классификатор" /> | ||
<xsl:apply-templates select="КоммерческаяИнформация/Каталог" /> | <xsl:apply-templates select="КоммерческаяИнформация/Каталог" /> | ||
− | + | ||
<xsl:apply-templates select="КоммерческаяИнформация/ПакетПредложений" /> | <xsl:apply-templates select="КоммерческаяИнформация/ПакетПредложений" /> | ||
− | + | ||
<xsl:if test="count(КоммерческаяИнформация/Документ)"> | <xsl:if test="count(КоммерческаяИнформация/Документ)"> | ||
<xsl:apply-templates select="КоммерческаяИнформация" mode="document" /> | <xsl:apply-templates select="КоммерческаяИнформация" mode="document" /> | ||
</xsl:if> | </xsl:if> | ||
+ | |||
+ | <xsl:variable name="classid" select="КоммерческаяИнформация/Классификатор/Ид" /> | ||
+ | |||
<hierarchy> | <hierarchy> | ||
<xsl:apply-templates select="КоммерческаяИнформация/Каталог/Товары/Товар" mode="hierarchy"/> | <xsl:apply-templates select="КоммерческаяИнформация/Каталог/Товары/Товар" mode="hierarchy"/> | ||
− | <xsl:apply-templates select="КоммерческаяИнформация/Классификатор/Группы" mode="hierarchy"/> | + | <xsl:apply-templates select="КоммерческаяИнформация/Классификатор/Группы" mode="hierarchy"> |
+ | <xsl:with-param name="classid"> | ||
+ | <xsl:copy-of select="$classid" /> | ||
+ | </xsl:with-param> | ||
+ | </xsl:apply-templates> | ||
</hierarchy> | </hierarchy> | ||
</umidump> | </umidump> | ||
Строка 42: | Строка 51: | ||
теперь добавим эти шаблоны в наш кастомный файл: | теперь добавим эти шаблоны в наш кастомный файл: | ||
<source lang=xml> | <source lang=xml> | ||
− | <xsl:template match="КоммерческаяИнформация/Каталог/Товары/Товар" mode="hierarchy"> | + | <xsl:template match="КоммерческаяИнформация/Каталог/Товары/Товар" mode="hierarchy"> |
<relation id="{Ид}" parent-id="{Группы/Ид}"/> | <relation id="{Ид}" parent-id="{Группы/Ид}"/> | ||
</xsl:template> | </xsl:template> | ||
− | + | ||
<xsl:template match="КоммерческаяИнформация/Классификатор/Группы" mode="hierarchy"> | <xsl:template match="КоммерческаяИнформация/Классификатор/Группы" mode="hierarchy"> | ||
− | <xsl:apply-templates select="//Группа"/> | + | <xsl:param name="classid" /> |
+ | <xsl:apply-templates select="//Группа" > | ||
+ | <xsl:with-param name="classid"> | ||
+ | <xsl:copy-of select="$classid" /> | ||
+ | </xsl:with-param> | ||
+ | </xsl:apply-templates> | ||
</xsl:template> | </xsl:template> | ||
− | + | ||
<xsl:template match="//Группа" > | <xsl:template match="//Группа" > | ||
− | <xsl:apply-templates select="Группы/Группа | + | <xsl:param name="classid" /> |
+ | <xsl:if test="name(../../.) = 'Классификатор'"> | ||
+ | <relation id="{Ид}" parent-id="{$classid}"/> | ||
+ | </xsl:if> | ||
+ | <xsl:apply-templates select="Группы/Группа" mode="ghierarchy"> | ||
<xsl:with-param name="parent"> | <xsl:with-param name="parent"> | ||
<xsl:copy-of select="Ид" /> | <xsl:copy-of select="Ид" /> | ||
Строка 57: | Строка 75: | ||
</xsl:apply-templates> | </xsl:apply-templates> | ||
</xsl:template> | </xsl:template> | ||
− | + | ||
− | <xsl:template match="Группы/Группа | + | <xsl:template match="Группы/Группа" mode="ghierarchy"> |
<xsl:param name="parent" /> | <xsl:param name="parent" /> | ||
− | + | <relation id="{Ид}" parent-id="{$parent}"/> | |
+ | <xsl:apply-templates select="Группы/Группа" mode="ghierarchy"> | ||
+ | <xsl:with-param name="parent"> | ||
+ | <xsl:copy-of select="Ид" /> | ||
+ | </xsl:with-param> | ||
+ | </xsl:apply-templates> | ||
</xsl:template> | </xsl:template> | ||
</source> | </source> |
Текущая версия на 08:44, 13 сентября 2016
В статье Как_переместить_страницу_если_её_раздел_поменялся есть более простое решение
При импорте из CommerceML2.0 объекты располагаются в том иерархическом порядке, в котором они были в исходном файле, в дальнейшем, при обновлении данных средствами импорта их положение уже не изменяется, а обращение к объекту идёт напрямую по его идентификатору. Если требуется при обмене данными с 1С изменять иерархию в соответствии с импортируемыми данными, то необходимо добавить соответствующую обработку в шаблон импорт.
Перед импортом входящая информация из commerceML2.0 трансформируется по XSLT шаблону в формат UmiDump2.0. За иерархические связи в UmiDump отвечает нода <hierarchy>. Для того чтобы при импорте структура каталога обновлялась, необходимо чтобы после трансформации в UmiDump в нём были записи об иерархических связях. Для этого скопируем содержимое файла ~/xsl/import/commerceML2.xsl в ~/xsl/import/custom/commerceML2.xsl удалив строку <xsl:include href="custom/commerceML2.xsl" />.
После этого находим шаблон
<xsl:template match="/">
<umidump xmlns:xlink="http://www.w3.org/TR/xlink" version="2.0">
<xsl:apply-templates select="КоммерческаяИнформация/Классификатор" />
<xsl:apply-templates select="КоммерческаяИнформация/Каталог" />
<xsl:apply-templates select="КоммерческаяИнформация/ПакетПредложений" />
<xsl:if test="count(КоммерческаяИнформация/Документ)">
<xsl:apply-templates select="КоммерческаяИнформация" mode="document" />
</xsl:if>
</umidump>
</xsl:template>
и изменяем его, подключив два шаблона
<xsl:template match="/">
<umidump xmlns:xlink="http://www.w3.org/TR/xlink" version="2.0">
<xsl:apply-templates select="КоммерческаяИнформация/Классификатор" />
<xsl:apply-templates select="КоммерческаяИнформация/Каталог" />
<xsl:apply-templates select="КоммерческаяИнформация/ПакетПредложений" />
<xsl:if test="count(КоммерческаяИнформация/Документ)">
<xsl:apply-templates select="КоммерческаяИнформация" mode="document" />
</xsl:if>
<xsl:variable name="classid" select="КоммерческаяИнформация/Классификатор/Ид" />
<hierarchy>
<xsl:apply-templates select="КоммерческаяИнформация/Каталог/Товары/Товар" mode="hierarchy"/>
<xsl:apply-templates select="КоммерческаяИнформация/Классификатор/Группы" mode="hierarchy">
<xsl:with-param name="classid">
<xsl:copy-of select="$classid" />
</xsl:with-param>
</xsl:apply-templates>
</hierarchy>
</umidump>
</xsl:template>
теперь добавим эти шаблоны в наш кастомный файл:
<xsl:template match="КоммерческаяИнформация/Каталог/Товары/Товар" mode="hierarchy">
<relation id="{Ид}" parent-id="{Группы/Ид}"/>
</xsl:template>
<xsl:template match="КоммерческаяИнформация/Классификатор/Группы" mode="hierarchy">
<xsl:param name="classid" />
<xsl:apply-templates select="//Группа" >
<xsl:with-param name="classid">
<xsl:copy-of select="$classid" />
</xsl:with-param>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="//Группа" >
<xsl:param name="classid" />
<xsl:if test="name(../../.) = 'Классификатор'">
<relation id="{Ид}" parent-id="{$classid}"/>
</xsl:if>
<xsl:apply-templates select="Группы/Группа" mode="ghierarchy">
<xsl:with-param name="parent">
<xsl:copy-of select="Ид" />
</xsl:with-param>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="Группы/Группа" mode="ghierarchy">
<xsl:param name="parent" />
<relation id="{Ид}" parent-id="{$parent}"/>
<xsl:apply-templates select="Группы/Группа" mode="ghierarchy">
<xsl:with-param name="parent">
<xsl:copy-of select="Ид" />
</xsl:with-param>
</xsl:apply-templates>
</xsl:template>
теперь при обмене данными с 1С иерархия будет изменятся в соответствии с иерархией из импортируемого файла.