Häufigkeiten von Werten in einer XSL-Schleife
Marcus Schmidt
- xsl
0 Thomas J.S.0 Skeeve
Hallo,
ich baue gerade ein XSL, welches ein SVG erzeugt. Mein Problem ist, dass ich in einer Schleife ermitteln möchte wie oft der gleiche Wert aktuell an der Stelle in der Schleife bereits vorkam. Es ist notwendig um zusammengehörige Werte in einem Balkendiagramm nebeneinander darzustellen.
ZUr Veranschaulichung ein Beispiel anhand xml:
<FF>
<meta>
<Value2>4.9</Value2>
<Value1>5.7</Value1>
<FileName>file2</FileName>
<Quantity>1</Quantity>
</meta>
<meta>
<Value2>4.9</Value2>
<Value1>6.0</Value1>
<FileName>file3</FileName>
<Quantity>1</Quantity>
</meta>
<meta>
<Value2>4.0</Value2>
<Value1>10.0</Value1>
<FileName>file10</FileName>
<Quantity>1</Quantity>
</meta>
<meta>
<Value2>2.9</Value2>
<Value1>5.7</Value1>
<FileName>file4</FileName>
<FileName>file5</FileName>
<Quantity>2</Quantity>
</meta>
</FF>
Die Schleife durchläuft also die meta tags ( for-each select="//meta") und soll wie oben zu sehen beim 2. mal "Value1 = 5.7" erkennen, dass der Wert bereits genau ein mal vorkam. Hoffentlich hat jemand ne Lösung für das XSL?
Gruß
Marcus
Hallo,
ich baue gerade ein XSL, welches ein SVG erzeugt. Mein Problem ist, dass ich in einer Schleife ermitteln möchte wie oft der gleiche Wert aktuell an der Stelle in der Schleife bereits vorkam. Es ist notwendig um zusammengehörige Werte in einem Balkendiagramm nebeneinander darzustellen.
Die Schleife durchläuft also die meta tags ( for-each select="//meta") und soll wie oben zu sehen beim 2. mal "Value1 = 5.7" erkennen, dass der Wert bereits genau ein mal vorkam. Hoffentlich hat jemand ne Lösung für das XSL?
Mit for-each wirst du das nicht machen können. for-each ist keine Schleife, es instanziiert genau einmal die enthaltene Anweisungen für das betreffende Element (bei dir also meta). D.h. der Zähler ist das jedes mal 1.
Du könntest höchsten immer wieder abfragen ob (preceding-sibling::Value2 = ./Value2) zutrifft.
Die andere Möglichkeit ist ein rekursives Template.
Grüße
Thomas
Moin!
Vielleicht hilft Dir das als Ansatz?
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="FF">
<FF>
<xsl:for-each-group select="meta" group-by="Value1/text()">
<gruppe>
<xsl:copy-of select="current-group()"/>
</gruppe>
</xsl:for-each-group>
</FF>
</xsl:template>
</xsl:stylesheet>
Das Ergebnis ist dann sowas wie:
<?xml version="1.0" encoding="UTF-8"?>
<FF>
<gruppe>
<meta>
<Value2>4.9</Value2>
<Value1>5.7</Value1>
<FileName>file2</FileName>
<Quantity>1</Quantity>
</meta>
<meta>
<Value2>2.9</Value2>
<Value1>5.7</Value1>
<FileName>file4</FileName>
<FileName>file5</FileName>
<Quantity>2</Quantity>
</meta>
</gruppe>
<gruppe>
<meta>
<Value2>4.9</Value2>
<Value1>6.0</Value1>
<FileName>file3</FileName>
<Quantity>1</Quantity>
</meta>
</gruppe>
<gruppe>
<meta>
<Value2>4.0</Value2>
<Value1>10.0</Value1>
<FileName>file10</FileName>
<Quantity>1</Quantity>
</meta>
</gruppe>
</FF>
Du siehst: hier wird anhand des gleichen Value1 gruppiert. Innerhalb des Bereichs, den ich hier mit <gruppe> ausgebe mußt Du natürlich Deinen Code einbauen.
-- Skeeve
Hi,
Vielleicht hilft Dir das als Ansatz?
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
[...]
<xsl:for-each-group select="meta" group-by="Value1/text()">
Es besteht die Gefahr, daß Marcus das nicht verwenden kann - nicht jeder hat schon XSLT 2.0 zur Verfügung ...
cu,
Andreas
--
[Warum nennt sich Andreas hier MudGuard?](http://MudGuard.de/)
[Schreinerei Waechter](http://www.schreinerei-waechter.de/)
[O o ostern ...](http://ostereier.andreas-waechter.de/)
Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
Moin!
Es besteht die Gefahr, daß Marcus das nicht verwenden kann - nicht jeder hat schon XSLT 2.0 zur Verfügung ...
Das sind tragische Einzelschicksale auf die ich leider keine Rücksicht nehmen kann. War auch nirgends in Randbedingungen genannt. Aber mal ehrlich: Ich habe auch lange 1.0 verwendet. Es ist schon ein Krampf wie sehr man sich da manchmal verbiegen muß um etwas zu bewerkstelligen. Es war dann eigentlich recht einfach, meine Kollegen zu überzeugen, für unser Programm vollständig auf 2.0 umzusteigen.
-- Skeeve
Hallo,
Es besteht die Gefahr, daß Marcus das nicht verwenden kann - nicht jeder hat schon XSLT 2.0 zur Verfügung ...
Das sind tragische Einzelschicksale auf die ich leider keine Rücksicht nehmen kann.
Vergiss nicht was du da geschrieben hast, wenn du bei deinem nächsten Problem hier im Forum eine Frage stellst.
Aber mal ehrlich: Ich habe auch lange 1.0 verwendet. Es ist schon ein Krampf wie sehr man sich da manchmal verbiegen muß um etwas zu bewerkstelligen. Es war dann eigentlich recht einfach, meine Kollegen zu überzeugen, für unser Programm vollständig auf 2.0 umzusteigen.
Nicht jeder hat die Möglichkeit "einfach" umzusteigen. Eine kleine Firma mit 5-10 Leuten und ein oder zwei kleine Anwendungen hat es leichter als eine mit 200 Mitarbeiter und einer dreitstellingen Zahl von laufenden Anwendungen.
Davon abgesehen: kannst du hmm... sagen wir: 4 XSLT2-Prozesseren nennen, die XSLT2 komplett implementieren? (von Schema-Aware noch gar nicht gesprochen).
Und davon abgesehen: XSLT 2.0 ist noch immer keine Rec. und was die Änderungen angeht, sie sind zahlreich genug (auch jenseits von Tippfehlern): http://www.w3.org/TR/xslt20/#changes-2006-11.
Und davon abgesehen: für einsteiger ist XSLT2 eine echte Hürde, da muss man einige andere Sachen wie XPath 2.0 zwingend und andere vielleicht weniger zwingend aber auch wohl (wie z.B. XML-Schema etc.) mitlernen. Dagegen ist XSLT 1.0 wirklich nicht schwer zu lernen.
Grüße
Thomas
Moin!
Vergiss nicht was du da geschrieben hast, wenn du bei deinem nächsten Problem hier im Forum eine Frage stellst.
Du solltest nicht jedes meiner Worte auf die Goldwaage legen.
Nicht jeder hat die Möglichkeit "einfach" umzusteigen. Eine kleine Firma mit 5-10 Leuten
Wir sind 12. Die Anwendung ist aber für > 10000 weltweit (schätze ich).
Davon abgesehen: kannst du hmm... sagen wir: 4 XSLT2-Prozesseren nennen, die XSLT2 komplett implementieren?
Uns hat einer gereicht der genügen implementiert.
Und davon abgesehen: XSLT 2.0 ist noch immer keine Rec. und was die Änderungen angeht, sie sind zahlreich genug (auch jenseits von Tippfehlern): http://www.w3.org/TR/xslt20/#changes-2006-11.
Du bist ja echt auf dem Laufenden. Ich leider nicht.
Und davon abgesehen: für einsteiger ist XSLT2 eine echte Hürde, da muss man einige andere Sachen wie XPath 2.0 zwingend und andere vielleicht weniger zwingend aber auch wohl (wie z.B. XML-Schema etc.) mitlernen.
Du mußt doch nciht alles beherrschen. Es reicht doch, sich den Teil rauszupciken, den man braucht. Nicht anders mache ich es.
Dagegen ist XSLT 1.0 wirklich nicht schwer zu lernen.
Naja... Ich habe schon einige Zeit gebraucht, es zu verstehen. Ich würde nicht behaupten es gänzlich zu verstehen. Weder 1.0 noch 2.0.
-- Skeeve
Hallo,
Vergiss nicht was du da geschrieben hast, wenn du bei deinem nächsten Problem hier im Forum eine Frage stellst.
Du solltest nicht jedes meiner Worte auf die Goldwaage legen.Nicht jeder hat die Möglichkeit "einfach" umzusteigen. Eine kleine Firma mit 5-10 Leuten
Wir sind 12. Die Anwendung ist aber für > 10000 weltweit (schätze ich).
Ich meinte damit nicht Anwender, sondern versch. laufende serverseitigen Applicationen. Eine sowatware kann man "leicht" umstellen, dutzende von verschiedenen Anwendungen sind schon schwieriger.
Davon abgesehen: kannst du hmm... sagen wir: 4 XSLT2-Prozesseren nennen, die XSLT2 komplett implementieren?
Uns hat einer gereicht der genügen implementiert.
Ja, einer der funktioniert genügt in der Tat, wenn er auf deiner Plattform läuft. ;-)
Grüße
Thomas
Moin!
Ich meinte damit nicht Anwender, sondern versch. laufende serverseitigen Applicationen.
Naja... Ich sehe da zwar kein Problem, aber "Your mileage may vary". Man muß ja nicht alles auf einen Schlag umstellen.
Ja, einer der funktioniert genügt in der Tat, wenn er auf deiner Plattform läuft. ;-)
Die "Platform" ist Java und es läuft problemlos im Moment auf Solaris, Linux, WinDOS und Mac OS X.
-- Skeeve
Hallo,
vielen Dank für die zahlreichen Antworten. Ich war leider verhindert und kann deshalb jetzt erst antworten. Bisher habe ich Xalan als XSLT Prozessor verwendet, aber ich kann ebenfalls Saxon einsetzen um nach dem XSLT 2.0 Standard zu transformieren. Ich werde nun die Vorschläge versuchen umzusetzen, bei auftretenden Problemen würde ich mich nochmal melden.
Gruß
Marcus
Moin!
aber ich kann ebenfalls Saxon einsetzen
Mit dem habe ich (in jEdit) mein Beispiel durchgetestet.
-- Skeeve