2013-08-30 7 views
0

Я хочу создать список, группируя свои записи xml по атрибуту используя. Вот мой XML:XSL-группа по атрибуту XML

<Content> 
    <contenItem ProductType="Breakfast" name="Eggs" /> 
    <contenItem ProductType="Breakfast" name="Bacon" /> 
    <contenItem ProductType="Lunch" name="Fish" /> 
    <contenItem ProductType="Dinner" name="Steak" /> 
</Content> 

Я пытаюсь получить этот результат, но не мог понять, как

<ul> 
    <li>Breakfast 
     <ul> 
      <li>Eggs</li> 
      <li>Bacon</li> 
     </ul> 
     </li> 
     <li>Lunch 
     <ul> 
      <li>Fish</li> 
     </ul> 
     </li> 
     <li>Dinner 
     <ul> 
      <li>Steak</li> 
     </ul> 
     </li> 
    </ul> 
+0

XSLT 1.0? или 2.0? –

+0

И что ты пробовал? Пожалуйста, отправьте образец XSL для критики и не попросите нас написать его для вас. –

+0

XSLT 1.0, я абсолютный новичок, и это моя первая попытка попробовать группировать по атрибутам. Поблагодарили бы за вашу помощь. Почти два дня пытался понять это. – Anna

ответ

0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="html" doctype-system="about:legacy-compat" encoding="UTF-8" indent="yes" /> 
<xsl:strip-space elements="*" /> 

<xsl:key name="kProductType" match="contenItem" use="@ProductType" /> 

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

<xsl:template match="/*"> 
<ul> 
    <xsl:apply-templates select="contenItem[ 
    generate-id() = generate-id(key('kProductType',@ProductType)[1])]" /> 
</ul> 
</xsl:template> 

<xsl:template match="contenItem"> 
<li> 
    <xsl:value-of select="@ProductType" /> 
    <ul> 
    <xsl:apply-templates select="key('kProductType',@ProductType)" mode="sublist"/> 
    </ul> 
</li> 
</xsl:template> 

<xsl:template match="contenItem" mode="sublist"> 
<li> 
    <xsl:value-of select="@name" /> 
</li> 
</xsl:template> 


</xsl:stylesheet> 
+0

Он работал как волшебный Шон! Спасибо огромное! Мне нужно было бы изучить, как это сработало! Еще раз спасибо, я очень ценю это! – Anna

+1

Группировка в XSLT 1.0 использует очень странную и замечательную технику под названием «Muenchian grouping». Вероятно, вы найдете его в большинстве учебников XSLT. В XSLT 2.0 существует гораздо более удобный подход с использованием новой инструкции xsl: for-each-group. –