преобразование XML с использованием данных из другого файла XML

У меня есть следующий XML, и файл, содержащий продукты с идентификатором категории. Последняя строка xml содержит идентификатор категории с именем и родительский идентификатор категории с именем.

Мне нужно изменить категорию идентификатора продукта для имени и упорядочить категории и родительские категории.
Есть входной XML:

<Export>
<Products>
<produkt>
<Nazev>forma 21cm skl.</Nazev>
<Code>200011</Code>
<Kategorie>3</Kategorie>
</produkt>
</Products>
</Export>

<Categories>
<kategorie><id>1</id><ParentId></ParentId><Nazev>category1</Nazev></kategorie>
<kategorie><id>2</id><ParentId>1</ParentId><Nazev>category2</Nazev></kategorie>
<kategorie><id>3</id><ParentId>2</ParentId><Nazev>category3</Nazev></kategorie>
</Categories>
</Export>

и вот выходной XML:

<Export>
<Products>
<produkt>
<Nazev>forma 21cm skl.</Nazev>
<Code>200011</Code>
<Kategorie>category2 > category2 > category3</Kategorie>
</produkt>
</Products>
</Export>

Но я понятия не имею, как сделать это, используя скрипт XSL или PHP.

0

Решение

Это хитрый. Попробуйте это так:

XSLT 1.0

<xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="kategorie" match="kategorie" use="id" />

<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="Kategorie">
<xsl:copy>
<xsl:apply-templates select="key('kategorie', .)"/>
</xsl:copy>
</xsl:template>

<xsl:template match="kategorie">
<xsl:if test="key('kategorie', ParentId)">
<xsl:apply-templates select="key('kategorie', ParentId)" />
<xsl:text disable-output-escaping="yes"> > </xsl:text>
</xsl:if>
<xsl:value-of select="Nazev" />
</xsl:template>

<xsl:template match="Categories"/>

</xsl:stylesheet>

Применимо к правильно сформированный (!) ввод:

<Export>
<Products>
<produkt>
<Nazev>forma 21cm skl.</Nazev>
<Code>200011</Code>
<Kategorie>3</Kategorie>
</produkt>
</Products>
<Categories>
<kategorie>
<id>1</id>
<ParentId/>
<Nazev>category1</Nazev>
</kategorie>
<kategorie>
<id>2</id>
<ParentId>1</ParentId>
<Nazev>category2</Nazev>
</kategorie>
<kategorie>
<id>3</id>
<ParentId>2</ParentId>
<Nazev>category3</Nazev>
</kategorie>
</Categories>
</Export>

результат будет:

<?xml version="1.0" encoding="UTF-8"?>
<Export>
<Products>
<produkt>
<Nazev>forma 21cm skl.</Nazev>
<Code>200011</Code>
<Kategorie>category1 > category2 > category3</Kategorie>
</produkt>
</Products>
</Export>
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]