Toon posts:

[xslt] groeperen op attribuut

Pagina: 1
Acties:

Verwijderd

Topicstarter
ik heb een msn xml log bestand met vereenvoudigde xml:
XML:
1
2
3
4
5
6
7
8
<Log  FirstSessionID="1" LastSessionID="3">
  <Message Date="3/1/04" SessionID="1">
  <Message Date="3/1/04" SessionID="1">
  <Message Date="3/1/04" SessionID="1">
  <Message Date="4/1/04" SessionID="2">
  <Message Date="4/1/04" SessionID="2">
  <Message Date="5/1/04" SessionID="3">
</Log>


en dit moet worden:
HTML:
1
2
3
4
5
6
7
8
9
<h2>sessie 1:</h2>
<ul>
  <li />
  <li />
  <li />
</ul>
<h2>sessie2:</h2>
<ul>
 ...etc


Ik wil dus per SessionId een lijst maken met daarin alle messages, ik heb alleen niet echt een idee hoe ik dit op kan lossen. Ik heb nu een template die van elke message een li maakt met de info erin, alleen ik wil dus al die li's groeperen in een ul per sessie.

[ Voor 44% gewijzigd door Verwijderd op 20-03-2004 12:08 ]


Verwijderd

Vraagje vooraf: staan de session id's op volgorde? Eerst alle messages met id 1, dan alles met id 2, of kan het door elkaar staan? (e.g. 1, 2, 3, 3, 1, 3, 2, 2)

Verwijderd

Topicstarter
op volgorde, ik moet dus iets hebben als:

vage js/xslt mix code:
code:
1
2
3
4
5
for (i=log/@FirstSessionID; i<=log/@LastSessionID; i++) {
<xsl:for-each select="Message[@SessionID=i]">
  meuk
</xsl:for-each>
}

[ Voor 10% gewijzigd door Verwijderd op 20-03-2004 12:20 ]


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?xml version="1.0" encoding="iso-8859-1"?>

<xsl:stylesheet 
    version="2.0"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output 
    method="xhtml"
    encoding="iso-8859-1"
    indent="yes"
    omit-xml-declaration="no"
    doctype-public="-//W3C//DTD XHTML 1.1//EN"
    doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"/>

<xsl:template match="/">
    <html>
    <body>
        <xsl:call-template name="list">
            <xsl:with-param name="currentID" select="/Log/@FirstSessionID"/>
        </xsl:call-template>
    </body>
    </html>
</xsl:template>


<xsl:template name="list">

    <xsl:param name="currentID"/>

    <h2>sessie <xsl:value-of select="$currentID"/>:</h2>
    <ul>
    <xsl:for-each select="/Log/Message[@SessionID = $currentID]">
        <li><xsl:apply-templates/></li>
    </xsl:for-each>
    </ul>

    <xsl:if test="$currentID &lt; /Log/@LastSessionID">
        <xsl:call-template name="list">
            <xsl:with-param name="currentID" select="$currentID + 1"/>
        </xsl:call-template>
    </xsl:if>

</xsl:template>

</xsl:stylesheet>


Dit werkt. Ik heb het net getest met deze XML:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="iso-8859-1"?>
<?xml-stylesheet type="text/xsl" href="id.xsl"?>

<Log  FirstSessionID="1" LastSessionID="3">
  <Message Date="3/1/04" SessionID="1">
    a
  </Message>
  <Message Date="3/1/04" SessionID="1">
    b
  </Message>
  <Message Date="3/1/04" SessionID="1">
    c
  </Message>
  <Message Date="4/1/04" SessionID="2">
    d
  </Message>
  <Message Date="4/1/04" SessionID="2">
    e
  </Message>
  <Message Date="5/1/04" SessionID="3">
    f
  </Message>
</Log>

[ Voor 152% gewijzigd door Michali op 20-03-2004 12:41 ]

Noushka's Magnificent Dream | Unity


Verwijderd

Topicstarter
gebruik van een parameter was de goede hint, ik zat al met variabelen te friemelen, maar dat lukte niet echt
bedankt voor de hulp

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Het is inderdaad niet mogelijk om de waarde van een variabel te updaten in XSLT. Truukje om toch steeds een vernieuwde waarde in een parameter te krijgen is door een recursieve call te doen en zo de waarde vernieuwen. een beetje functioneel ipv. procedureel programeren dus.

Noushka's Magnificent Dream | Unity


Verwijderd

Topicstarter
Ik heb een nieuw probleem dat in het verlengde van deze ligt, dus vandaar in dit topic:

heb een lijst xml nodes met allemaal een type attribuut. Deze attrubuten kunnen willekeurig zijn, in willekeurige volgorde voorkomen en ook meerdere keren voorkomen.

Ik wil de nodes groeperen per attribuut en elke groep eruit gooien als een <dl>
de volgorde van die dl's en de dd's erbinnen zijn eigenlijk niet eens zo van belang

een parameter ophogen gaat nu niet, want het zijn strings en je kan ook geen lijstje doorlopen omdat je niet weet wat er kan komen

Bijvoorbeeld deze xml:
code:
1
2
3
4
5
6
<node type="murk">hoi</node>
<node type="flerk">blaat</node>
<node type="murk">doei</node>
<node type="haas">koe</node>
<node type="fiets">foei</node>
<node type="haas">melp</node>

moet worden
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<dl>
  <dt>murk</dt>
  <dd>hoi</dd>
  <dd>doei</dd>
</dl><dl>
  <dt>flerk</dt>
  <dd>blaat</dd>
</dl><dl>
  <dt>haas</dt>
  <dd>koe</dd>
  <dd>melp</dd>
</dl><dl>
  <dt>fiets</dt>
  <dd>foei</dd>
</dl>

Verwijderd

Topicstarter
m'n huidige plan is weer met een parameters te werken, nu eentje waarin de types die al geweest zijn als string door iets gescheiden instaan. met de contains() functie zou ik dan kunnen kijken of die al geweest is, zo ja een dd toevoegen aan een bestaande parameter (variabele?), zo nee een nieuwe parameter declareren en daar de dl, dt en eerste dd aan toevoegen.

Vooralsnog lukt het me niet xml parsing errors te ontwijken

overigens als jullie behoefte hebben aan code die ik al geprobeerd heb, wil ik dat best erbij zetten, maar het is zo'n getast in het duister dat het eigenlijk nergens op slaat

Weet iemand anders een goede xslt tut buiten w3schools?

[ Voor 23% gewijzigd door Verwijderd op 23-05-2004 23:12 ]

Pagina: 1