У меня есть следующий 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.
Это хитрый. Попробуйте это так:
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>
Других решений пока нет …