Globale Variable oder Param
dey
- xsl
0 Thomas J.S.0 dey0 Thomas J.S.
Moin moin,
es tut mir wirklich leid, dass ich dieses leidige Thema (nimmt ja fast schon "2 Frames"- Ausmasse an) schon wieder anschneiden muss. Im Archiv habe ich gesucht und gefunden, aber die Antworten habe mir zwar viele Versuche, aber keine erfolgreiche Lösung beschert:
Ich möchte mit der Abfrage <xsl:when test="$changecolor = '0'"> von Zeile zu Zeile die class meiner td tags ändern.
Dazu möchte ich am Ende des <xsl:for-each select="addressbook/member"> den Wert von changecolor in Abhängigkeit seines eigenen Wertes von 0 auf 1 oder umgekehrt setzen.
Ist natürlich mit Varible nicht erlaubt.
Ich habe für ein ähnliches Problem schon mit call und with-param gearbeitet. Das bekomme ich jetzt aber irgendwir nicht schlau in mein for-each. Irgenwie erscheint mir das wie ein doppelter loop.
Das for-each brauch ich für mein grouping [pref:t=69123&m=397427], denn sonst darf ich sort nicht verwenden.
Wie bekomme ich jetzt changecolor so definiert, dass ich es, in Abhängigkeit zu sich selbst und dem nächsten Namen (Knoten name) ändern kann?
?:-(
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="no"/>
<xsl:template match="/">
<table border="1">
<tr>
<td>Name</td><td>Email</td><td>Tel. Nr.</td>
</tr>
<xsl:for-each select="addressbook/member">
<xsl:sort select="name"/>
<xsl:variable name="lastname" select="name"/>
<xsl:variable name="changecolor" select="0"/>
<xsl:if test="not(preceding-sibling::member[name=$lastname])">
<tr>
<td>
xsl:choose
<xsl:when test="$changecolor = '0'">
<xsl:attribute name="class">greyl</xsl:attribute>
</xsl:when>
xsl:otherwise
<xsl:attribute name="class">greyd</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
<xsl:value-of select="name"/>
</td>
<td>
<xsl:for-each select="/addressbook/member[name=$lastname]">
<xsl:sort select="enam1" order="descending"/>
<xsl:value-of select="enam1"/>
<xsl:if test="enam1 != ''">
<br/>
</xsl:if>
</xsl:for-each>
</td>
<td>
<xsl:for-each select="/addressbook/member[name=$lastname]">
<xsl:sort select="telno" order="descending" data-type="number"/>
<xsl:value-of select="telno"/>
<xsl:if test="telno != ''">
<br/>
</xsl:if>
</xsl:for-each>
</td></tr>
</xsl:if>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
bydey
Hallo,
»»»» Wie bekomme ich jetzt changecolor so definiert, dass ich es, in Abhängigkeit zu sich selbst und dem nächsten Namen (Knoten name) ändern kann?
Gib mir bitte noch ein Stück deines XMLs!
Grüße
Thomas
Moin moin Thomas,
Gib mir bitte noch ein Stück deines XMLs!
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="groupadreslist.xsl" ?>
<addressbook>
<member>
<name>Test, Anton</name>
<adres>1234 Main adres</adres>
<city>Sheboygan</city>
<enam1>WI</enam1>
<telno>48392</telno>
</member>
<member>
<name>Test, Anton</name>
<adres>283 First Avenue</adres>
<city>Skunk Haven</city>
<telno>02718</telno>
</member> </member>
</addressbook>
Habe im Moment 7 Einträge, wobei nicht alle die gleichen Felder enthalten. Damit experimenriere ich gerade.
bydey
Hallo,
Gib mir bitte noch ein Stück deines XMLs!
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="groupadreslist.xsl" ?><addressbook>
Ich habe dein XSL ein wenig umgeschrieben.
Grüße
Thomas
---------------- XSL ----------------------
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes" encoding="iso-8859-1" />
<xsl:key name="namen" match="addressbook/member" use="name" />
<xsl:template match="/">
<html>
<head>
<title>Untitled</title>
<style type="text/css">
.gray { background-color:gray; }
.silver { background-color:silver; }
</style>
</head>
<body>
<xsl:apply-templates />
</body>
</html>
</xsl:template>
<xsl:template match="addressbook">
<table border="1">
<tr>
<td>Name</td><td>Email</td><td>Tel. Nr.</td>
</tr>
<xsl:for-each select="member[generate-id(.) != generate-id(key('namen', name))]">
<xsl:sort select="name"/>
<tr>
<td>
xsl:choose
<xsl:when test="position() mod 2 = 0">
<xsl:attribute name="class">gray</xsl:attribute>
</xsl:when>
xsl:otherwise
<xsl:attribute name="class">silver</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
<xsl:value-of select="name"/>
</td>
<td>
<xsl:for-each select="key('namen', name)">
<xsl:sort select="enam1" order="descending"/>
<xsl:value-of select="enam1"/>
<xsl:if test="enam1 != ''">
<br/>
</xsl:if>
</xsl:for-each>
</td>
<td>
<xsl:for-each select="key('namen', name)">
<xsl:sort select="telno" order="descending" data-type="number"/>
<xsl:value-of select="telno"/>
<xsl:if test="telno != ''">
<br/>
</xsl:if>
</xsl:for-each>
</td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
---------------------- xml ------------------
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="day.xsl" ?>
<addressbook>
<member>
<name>Test, Anton</name>
<adres>1234 Main adres</adres>
<city>Sheboygan</city>
<enam1>WI</enam1>
<telno>48392</telno>
</member>
<member>
<name>Test, Anton</name>
<adres>283 First Avenue</adres>
<city>Skunk Haven</city>
<telno>02718</telno>
</member>
<member>
<name>Btest, Berta</name>
<adres>333 Address Mail</adres>
<city>WhereamI</city>
<enam1>NY</enam1>
<telno>1234567890</telno>
</member>
<member>
<name>Btest, Berta</name>
<adres>666 Last Day</adres>
<city>Lost Soul</city>
<telno>666 666</telno>
</member>
<member>
<name>Utest, Paul</name>
<adres>ABCD Street Str</adres>
<city>Nowherte</city>
<enam1>TX</enam1>
<telno>445566</telno>
</member>
<member>
<name>Utest, Paul</name>
<adres>12A BBWY</adres>
<city>Telepolis</city>
<telno>333111222</telno>
</member>
<member>
<name>Dtest, Dora</name>
<adres>sss 234 ee</adres>
<city>bla bla</city>
<enam1>ad</enam1>
<telno>000111</telno>
</member>
<member>
<name>Dtest, Dora</name>
<adres>12A BBWY</adres>
<city>Telepolis</city>
<telno>444888</telno>
</member>
<member>
<name>Xtest, Xaver</name>
<adres>sss 234 ee</adres>
<city>bla bla</city>
<enam1>ad</enam1>
<telno>333666</telno>
</member>
<member>
<name>Xtest, Xaver</name>
<adres>12A BBWY</adres>
<city>Telepolis</city>
<telno>666111</telno>
</member>
</addressbook>
Moin moin Thomas,
bin schwer begeistert!
Jetzt muss ich mich mal durch die Änderungen arbeiten, um zu begreifen, was du gemacht hast.
Aber eines muss man schon sagen, XML soll ja zusammen mit XSL ein Ersatz für proprietäre Datenbanksysteme (z.B. Oracle, SAP, etc) darstellen.
Der Datentransfer rein und raus ist, wenn man XSL und SQL vergleicht, bei XSL ungleich komplizierter!
bydey
Hallo,
Der Datentransfer rein und raus ist, wenn man XSL und SQL vergleicht, bei XSL ungleich komplizierter!
Ansichtssache! Absolut Ansichtssache! 8-)
Grüße
Thomas
Hallo (nochmal),
bin schwer begeistert!
*hüstel* ehmm... ja. Danke ;-)
Jetzt muss ich mich mal durch die Änderungen arbeiten, um zu begreifen, was du gemacht hast.
<xsl:key name="namen" match="addressbook/member" use="name" />
Erstellt einen Knotenset, der alle addressbook/member-Elemente enthält. Als Wert des Schlüssels wird der name-element verwendet.
<xsl:for-each select="member[generate-id(.) != generate-id(key('namen', name))]">
Selektiert alljenige member-Elemente wo der generierte ID für's (gegenwertigen) Element nicht mit dem generierten ID eines Elements aus dem - vom key() - Knotenset übereinstimmt; als Vergleichsbasis dient das name-Element des gegenwertigen member-Elements
-----
es wäre hier egal gewesen, ob ich in deinem Fall [generate-id(.) != generate-id(key('namen', name))] oder generate-id(.) = generate-id(key('namen', name))] nehme.
Wenn du mehr als zwei name-Elemente mit demselben Namen hast nimm aber: <xsl:for-each select="member[generate-id(.) = generate-id(key('namen', name))]"> !
-----
<xsl:when test="position() mod 2 = 0">
Nachdem in die for-each-Schleife nur noch Elemente sind, von denen kein Duplikat mehr gibt (all das natürlich im Bezug zu member/name), kann man die Position der einzelnen Knoten in der Schleife bestimmen, deshalb kann jedes zweite Element mit einer anderen Farbe hintergelgt werden.
<xsl:for-each select="key('namen', name)">
Greift auf die Knoten zu, die im Knotenset vom key() als Wert des name-Elements denselben Wert haben wie das name-Element im gegenwertigen Element (--> das wurde ja durch das vorige for-each bestimmt).
Wenn es mehrere solche übereinstimmende Knoten im Knotenset vom key() gefunden werden, werden die Vorgaben im for-each für jede der Knoten (aus dem Knotenset vom key) angewendet.
Und im for-each kannst du dann auch wiederum sortieren etc.
Grüße
Thomas