#xml #for-loop #xslt
Вопрос:
У меня есть xml — файл, описывающий древовидную структуру интернет-магазина, и мне нужно только получить список всех дочерних групп. Я не знаю, сколько уровней родителя/ребенка в структуре. Входной xml выглядит следующим образом: «‘
<items>
<item>
<id>1</id>
<parent_id>0</parent_id>
<name>Cars</name>
</item>
<item>
<id>2</id>
<parent_id>0</parent_id>
<name>Tools</name>
</item>
<item>
<id>1001</id>
<parent_id>1</parent_id>
<name>Ford</name>
</item>
<item>
<id>1002</id>
<parent_id>1</parent_id>
<name>Toyota</name>
</item>
<item>
<id>5</id>
<parent_id>2</parent_id>
<name>Axe</name>
</item>
<item>
<id>1150</id>
<parent_id>1001</parent_id>
<name>Ka</name>
</item>
<item>
<id>1151</id>
<parent_id>1001</parent_id>
<name>Raptor</name>
</item>
</export>
»’
Вывод должен выглядеть как простой список всех дочерних групп, структура не имеет большого значения, сортировка также не важна».’
<groups>
<root>
<ID>1</ID>
<Child_ID>1001</Child_ID>
<Child_ID>1002</Child_ID>
<Child_ID>1150</Child_ID>
<Child_ID>1151</Child_ID>
</root>
<root>
<ID>2</ID>
<Child_ID>5</Child_ID>
</root>
</groups>
»’
Можете ли вы посоветовать мне, какие функции или процедуры следует преобразовать?
Комментарии:
1.
<items>
не совпадает</export>
.
Ответ №1:
Вот один из способов, которым вы могли бы взглянуть на это:
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:key name="child" match="item" use="parent_id"/>
<xsl:template match="items">
<groups>
<xsl:for-each select="item[parent_id=0]">
<group>
<ID>
<xsl:value-of select="id" />
</ID>
<xsl:apply-templates select="key('child', id)"/>
</group>
</xsl:for-each>
</groups>
</xsl:template>
<xsl:template match="item">
<Child_ID>
<xsl:value-of select="id" />
</Child_ID>
<xsl:apply-templates select="key('child', id)"/>
</xsl:template>
</xsl:stylesheet>
С хорошо сформированным (!) вводом, таким как:
XML
<items>
<item>
<id>1</id>
<parent_id>0</parent_id>
<name>Cars</name>
</item>
<item>
<id>2</id>
<parent_id>0</parent_id>
<name>Tools</name>
</item>
<item>
<id>1001</id>
<parent_id>1</parent_id>
<name>Ford</name>
</item>
<item>
<id>1002</id>
<parent_id>1</parent_id>
<name>Toyota</name>
</item>
<item>
<id>5</id>
<parent_id>2</parent_id>
<name>Axe</name>
</item>
<item>
<id>1150</id>
<parent_id>1001</parent_id>
<name>Ka</name>
</item>
<item>
<id>1151</id>
<parent_id>1001</parent_id>
<name>Raptor</name>
</item>
</items>
это приведет к:
Результат
<?xml version="1.0" encoding="UTF-8"?>
<groups>
<group>
<ID>1</ID>
<Child_ID>1001</Child_ID>
<Child_ID>1150</Child_ID>
<Child_ID>1151</Child_ID>
<Child_ID>1002</Child_ID>
</group>
<group>
<ID>2</ID>
<Child_ID>5</Child_ID>
</group>
</groups>