PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : XSL / XML


MeLLe
2006-06-09, 13:34:14
Hallo zusammen,

nachdem ich mein JSTL-Tomcat-Problem gelöst habe, habe ich nun noch eine Grunsatzfrage in Sachen XML/XSL - Styling.

Ausgehend von einer Datenreihe á la
<dbdata>
<queuesize>
<datetime>1</datetime>
<count>3</count>
</queuesize>

<queuesize>
<datetime>2</datetime>
<count>2</count>
</queuesize>

<queuesize>
<datetime>3</datetime>
<count>1</count>
</queuesize>

<queuesize>
<datetime>4</datetime>
<count>4</count>
</queuesize>

<queuesize>
<datetime>5</datetime>
<count>29</count>
</queuesize>
<dbdata>
werden die Daten mit diesem XSL-File
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<xsl:template match="/dbdata">
<xsl:variable name="ymax">
<xsl:for-each select="queuesize/count">
<xsl:sort data-type="number" order="descending"/>
<xsl:if test="position()=1"><xsl:value-of select="."/></xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:element name="graphData">
<xsl:element name="sets">
<xsl:element name="set">
<xsl:for-each select="queuesize">
<xsl:element name="measure">
<xsl:attribute name="color">green</xsl:attribute>
<!-- <xsl:choose>
<xsl:when test="count<20">
<xsl:attribute name="color">green</xsl:attribute>
</xsl:when>
<xsl:when test="count>100">
<xsl:attribute name="color">red</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="color">yellow</xsl:attribute>
</xsl:otherwise>
</xsl:choose> //-->
<xsl:element name="xvalue"><xsl:value-of select="datetime"/></xsl:element>
<xsl:element name="yvalue"><xsl:value-of select="count"/></xsl:element>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:element>
<xsl:element name="title">DBTM Message Queue Size over the last 24 Hours</xsl:element>
<xsl:element name="maxy"><xsl:value-of select="$ymax"/></xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
transformiert und dann durch dieses XSL-File
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xlink="http://www.w3.org/2000/xlink/namespace/"
version="1.0">
<xsl:output method="xml" media-type="image/svg" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/graphData">
<xsl:variable name="ymax">
<xsl:value-of select="maxy"/>
</xsl:variable>
<svg width="2160" height="150">
<defs>
</defs>
<text x="16" y="16" text-anchor="left" font-weight="bolder" font-size="14" fill="black" text-decoration="italic">
<xsl:value-of select="title"/>
</text>
<text x="16" y="40" text-anchor="left" font-weight="bolder" font-size="12" fill="red" text-decoration="bold">
Max: <xsl:value-of select="maxy"/>
</text>
<xsl:for-each select="sets/set">
<xsl:for-each select="measure">
<g>
<xsl:attribute name="style">
stroke:<xsl:value-of select="@color"/>;stroke-width:2;fill:<xsl:value-of select="@color"/>
</xsl:attribute>
<line>
<xsl:attribute name="x1">
<xsl:value-of select="xvalue*3"/>
</xsl:attribute>
<xsl:attribute name="y1">
<xsl:value-of select="150"/>
</xsl:attribute>
<xsl:attribute name="x2">
<xsl:value-of select="xvalue*3"/>
</xsl:attribute>
<xsl:attribute name="y2">
<xsl:value-of select="150-(150*(yvalue div $ymax))"/>
</xsl:attribute>
</line>
</g>
</xsl:for-each>
</xsl:for-each>
</svg>
</xsl:template>
</xsl:stylesheet>

in ein SVG-Image gewandelt.

Soweit wunderbar.
Allerdings wollte ich je nach Wert der Variablen "count" die jeweiligen Balken (LINE) andersfarbig - sprich rot, gelb, grün - färben. Das habe ich durch den im ersten XSL-File auskommentierten Block versucht. Leider ohne Erfolg. Mach ich was falsch?

Danke schonmal! :)

SgtTynis
2006-06-09, 18:44:46
Mal mit &gt; bzw. &lt; probiert?

MeLLe
2006-06-10, 20:04:42
SgtTynis[/POST]']Mal mit &gt; bzw. &lt; probiert?
Woohoo! That's it! Danke!!!
Weisst du auch, warum dass so sein muss? Warum kann ich da kein <, > verwenden? Und wie siehts aus bei >=, <=? Müsste ich dann &gt;= bzw &lt;= nehmen?
Anyway - danke danke danke! =)

HellHorse
2006-06-10, 22:03:23
MeLLe[/POST]']Woohoo! That's it! Danke!!!
Weisst du auch, warum dass so sein muss? Warum kann ich da kein <, > verwenden? Und wie siehts aus bei >=, <=? Müsste ich dann &gt;= bzw &lt;= nehmen?
Anyway - danke danke danke! =)
Weil das XML ist!!!11111einsself
< und & müssen "escaped" werden, weil sonst der Parser nicht klar kommt (daher logischerweise auch <=).
> " ' sind alle optional.

MeLLe
2006-06-11, 16:35:34
Danke für die klärenden Worte! =)
Dass man " escapen müsste seh ich ein (<xsl:if test="var1="hallo"">Holla!</xsl:if> sähe nicht nur für ein Menschenhirn blöd aus - auch ein Parser schwitzt da. Aber der Rest ... ? Naja, wenn man weiss, dass man escapen muss, isses auch wieder einfach :)
Danke nochmal euch beiden!