Hi,
ich bin relativ neu in XSL, habe aber bereits ein ganzes Buch verschlungen. Dennoch finde ich keine zufriedenstellende Lösung für mein aktuelles Problem, auch die Suche im mehreren Foren, einschließlich diesem, hat zu keinem Ergebnis geführt. Ich schildere einfach mal das Problem, doch zuerst die Struktur meiner XML-Datei:
<productlist>
<product>
<num>000160562</num>
<cat>Waschmaschinen</cat>
<name>Miele XY1</name>
</product>
<product>
<num>000160563</num>
<cat>Waschmaschinen</cat>
<name>Siemens CR3</name>
</product>
<product>
<num>000160565</num>
<cat>Radios</cat>
<name>Philips CT-1</name>
</product>
.
.
</productlist>
Nun möchte ich, dass mir der Inhalt von <cat>(Kategorie) ausgegeben wird, wenn jedoch eine Kategorie bereits vorkam, soll diese nicht nochmal ausgegeben werden. Für obigen Ausschnitt sollte das gewünschte Ergebnis wie folgt aussehen:
Waschmaschinen
Radios
Mit der preceding-Achse habe ich das hinbekommen, jedoch vergeht bei der Größe der Datei (über 10.000 Datensätze) eine halbe Ewigkeitbis das Ergebnis ausgegeben wird, falls nicht vorher der Browser mitsamt Webserver abstürzt. In einem anderen Forum habe ich gelesen, dass man bei größeren Dateien besser <xsl:key> verwenden sollte, daraufhin habe ich mir was zusammengeschustert, was bei wenigen Datensätzen zu funktionieren scheint, aber bei Anwendung auf die komplette Datei ebenfalls total versagt:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xslutput method="html" encoding="utf-8"/>
<xsl:key name="category" match="productlist/product" use="cat"/>
<xsl:template match="/productlist">
<xsl:for-each select="product[count(key('category',cat))]">
<div><xsl:value-of select="cat"/></div>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Demnach müsste die for-each-Schleife immer nur das letzte Produkt einer bestimmten Kategorie zurückgeben. Wie gesagt, bei kleinen Dateien klappts, bei großen leider nicht.
Vielen Dank schon mal für jede Hilfe.
ich bin relativ neu in XSL, habe aber bereits ein ganzes Buch verschlungen. Dennoch finde ich keine zufriedenstellende Lösung für mein aktuelles Problem, auch die Suche im mehreren Foren, einschließlich diesem, hat zu keinem Ergebnis geführt. Ich schildere einfach mal das Problem, doch zuerst die Struktur meiner XML-Datei:
<productlist>
<product>
<num>000160562</num>
<cat>Waschmaschinen</cat>
<name>Miele XY1</name>
</product>
<product>
<num>000160563</num>
<cat>Waschmaschinen</cat>
<name>Siemens CR3</name>
</product>
<product>
<num>000160565</num>
<cat>Radios</cat>
<name>Philips CT-1</name>
</product>
.
.
</productlist>
Nun möchte ich, dass mir der Inhalt von <cat>(Kategorie) ausgegeben wird, wenn jedoch eine Kategorie bereits vorkam, soll diese nicht nochmal ausgegeben werden. Für obigen Ausschnitt sollte das gewünschte Ergebnis wie folgt aussehen:
Waschmaschinen
Radios
Mit der preceding-Achse habe ich das hinbekommen, jedoch vergeht bei der Größe der Datei (über 10.000 Datensätze) eine halbe Ewigkeitbis das Ergebnis ausgegeben wird, falls nicht vorher der Browser mitsamt Webserver abstürzt. In einem anderen Forum habe ich gelesen, dass man bei größeren Dateien besser <xsl:key> verwenden sollte, daraufhin habe ich mir was zusammengeschustert, was bei wenigen Datensätzen zu funktionieren scheint, aber bei Anwendung auf die komplette Datei ebenfalls total versagt:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xslutput method="html" encoding="utf-8"/>
<xsl:key name="category" match="productlist/product" use="cat"/>
<xsl:template match="/productlist">
<xsl:for-each select="product[count(key('category',cat))]">
<div><xsl:value-of select="cat"/></div>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Demnach müsste die for-each-Schleife immer nur das letzte Produkt einer bestimmten Kategorie zurückgeben. Wie gesagt, bei kleinen Dateien klappts, bei großen leider nicht.
Vielen Dank schon mal für jede Hilfe.
Comment