У меня есть XSLT, который я создал для группировки данных для каталога обуви. Обувь должна быть сгруппирована по «линии» и «бренду». Заголовки Line и Brand должны появляться в начале каждого раздела. Каждая строка имеет более одного бренда. У каждого бренда обычно есть несколько ботинок.Группировка данных с использованием XSLT не работает полностью
Ниже приведен пример XML-данных:
<?xml version="1.0" encoding="UTF-8"?>
<catalog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<shoe>
<line>LINE 43: WOMENS BRANDED ATHLETIC</line>
<brand>WALKING</brand>
<style-name>NEW BALANCE-NB 475V2 (WIDE)</style-name>
<color>Black</color>
<price>67.99</price>
</shoe>
<shoe>
<line>LINE 43: WOMENS BRANDED ATHLETIC</line>
<brand>WALKING</brand>
<style-name>NEW BALANCE-496 (WIDE)</style-name>
<color>Grey/Pink</color>
<price>64.99</price>
</shoe>
<shoe>
<line>LINE 43: WOMENS BRANDED ATHLETIC</line>
<brand>CROSS TRANING</brand>
<style-name>FILA-MEMORY PANACHE</style-name>
<color>Black/Pink</color>
<price>69.99</price>
</shoe>
<shoe>
<line>LINE 43: WOMENS BRANDED ATHLETIC</line>
<brand>RUNNING</brand>
<style-name>FILA-VITALITY 2 TRAIL</style-name>
<color>Grey/Prpl/Turq</color>
<price>59.99</price>
</shoe>
<shoe>
<line>LINE 87: MENS BRANDED ATHLETIC</line>
<brand>CASUAL</brand>
<style-name>LEVI'S-HAMILTON BUCK HI</style-name>
<color>Black/Black</color>
<price>34.99</price>
</shoe>
<shoe>
<line>LINE 87: MENS BRANDED ATHLETIC</line>
<brand>CASUAL</brand>
<style-name>EVERLAST-EVAN SKATE</style-name>
<color>Black</color>
<price>29.99</price>
</shoe>
<shoe>
<line>LINE 87: MENS BRANDED ATHLETIC</line>
<brand>RUNNING</brand>
<style-name>SKECHERS-POWER SWITCH (WIDE)</style-name>
<color>Black/White</color>
<price>69.99</price>
</shoe>
<shoe>
<line>LINE 87: MENS BRANDED ATHLETIC</line>
<brand>RUNNING</brand>
<style-name>SKECHERS-EQUALIZER GEL TOP </style-name>
<color>Black</color>
<price>69.99</price>
</shoe>
</catalog>
Вот мой XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8"/>
<xsl:key name="shoes-by-line" match="shoe" use="line" />
<xsl:key name="shoes-by-brand" match="shoe" use="concat(line,'#',brand)" />
<xsl:template match="catalog">
<catalog>
<shoes>
<xsl:for-each select="shoe[count(. | key('shoes-by-line', line)[1]) = 1]">
<line>
<xsl:value-of select="line"/>
</line>
<brands>
<brand>
<xsl:value-of select="brand"/>
</brand>
<xsl:for-each select="key('shoes-by-brand', concat(line,'#',brand))">
<shoe>
<style-name>
<xsl:value-of select="style-name"/>
</style-name>
<color>
<xsl:value-of select="color"/>
</color>
<price>
<xsl:value-of select="price"/>
</price>
</shoe>
</xsl:for-each>
</brands>
</xsl:for-each>
</shoes>
</catalog>
</xsl:template>
</xsl:stylesheet>
Я получаю 1 "линия" и "бренд" 1, но я не получаю дополнительный брендов в каждой строке. В каждой строке должно быть не менее двух-трех брендов. В этом XML есть 2 строки.
Вот структуру XML, что я хочу:
<?xml version="1.0" encoding="UTF-8"?>
<catalog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<lines>
<line>LINE 43: WOMENS BRANDED ATHLETIC</line>
<brands>
<brand>WALKING</brand>
<shoes>
<shoe>
<style-name>NEW BALANCE-NB 475V2 (WIDE)</style-name>
<color>Black</color>
<price>67.99</price>
</shoe>
<shoe>
<style-name>NEW BALANCE-496 (WIDE)</style-name>
<color>Grey/Pink</color>
<price>64.99</price>
</shoe>
</shoes>
</brands>
</lines>
<lines>
<line>LINE 43: WOMENS BRANDED ATHLETIC</line>
<brands>
<brand>CROSS TRANING</brand>
<shoes>
<shoe>
<style-name>FILA-MEMORY PANACHE</style-name>
<color>Black/Pink</color>
<price>69.99</price>
</shoe>
<shoe>
<line>LINE 43: WOMENS BRANDED ATHLETIC</line>
<brand>RUNNING</brand>
<style-name>FILA-VITALITY 2 TRAIL</style-name>
<color>Grey/Prpl/Turq</color>
<price>59.99</price>
</shoe>
</shoes>
</brands>
</lines>
<lines>
<line>LINE 87: MENS BRANDED ATHLETIC</line>
<brands>
<brand>CASUAL</brand>
<shoes>
<shoe>
<style-name>LEVI'S-HAMILTON BUCK HI</style-name>
<color>Black/Black</color>
<price>34.99</price>
</shoe>
<shoe>
<style-name>EVERLAST-EVAN SKATE</style-name>
<color>Black</color>
<price>29.99</price>
</shoe>
</shoes>
</brands>
</lines>
<lines>
<line>LINE 87: MENS BRANDED ATHLETIC</line>
<brands>
<brand>RUNNING</brand>
<shoes>
<shoe>
<line>LINE 87: MENS BRANDED ATHLETIC</line>
<brands>
<brand>RUNNING</brand>
<shoes>
<shoe>
<style-name>SKECHERS-POWER SWITCH (WIDE)</style-name>
<color>Black/White</color>
<price>69.99</price>
</shoe>
<shoe>
<style-name>SKECHERS-EQUALIZER GEL TOP </style-name>
<color>Black</color>
<price>69.99</price>
</shoe>
</shoes>
</brands>
</lines>
</catalog>
На мой взгляд, ваш ответ может быть значительно улучшен, если вы добавили объяснение выполненных вами корректировок. –
@ MathiasMüller Спасибо за ваши проблемы, я в настоящее время добавляю это, поскольку я разделяю ваше мнение, а также не предпочитаю давать только ответы на код (хотя настройки здесь были незначительными). –
Это решение еще не дает правильного вывода. Когда я запускаю этот отрегулированный XSLT, он показывает только две LINES (43 и 87) с одним BRAND (WALKING & CASUAL) каждый. Если вы посмотрите на образец XML, в «LINE» 43 и 2 «BRANDS» в «LINE» 87 есть 3 BRANDS. –