Toon posts:

[XML/XSLT] Data uit 2 xml bestanden ophalen

Pagina: 1
Acties:

Verwijderd

Topicstarter
De situatie:
Op een machine wordt telkens informatie weggeschreven naar een XML bestand (log.xml) Ik heb een stylesheet gemaakt zodat ik die informatie netjes op een webpagina kan weergeven.

Het log bestand bevat onder meer de tag <info> Hier wordt enkel een cijfer bewaard. Voor de gebruiker is het nogal omslachtig om uit te zoeken wat dit cijfer betekend.
In een ander bestand wil ik dus de betekenis van dit cijfer uitleggen. (extendedinfo.xml). Zodat op de webpagina de uitleg verschijnt ipv het cijfer.

Probleem:
Hoe moet ik nu de stylesheet aanpassen zodat de webpagina de informatie van het cijfer ophaalt uit het 2e xml bestand?
De opbouw van beide XML bestanden kan aangepast worden.

Inhoud van het bestand log.xml :
code:
1
2
3
4
5
<?xml version="1.0" ?>
<messages>
<message><id>0</id><info>2</info><duration>107</duration></message>
<message><id>0</id><info>1</info><duration>1</duration></message>
</messages>


inhoud van het bestand extrainfo.xml
code:
1
2
3
4
5
6
<?xml version="1.0" encoding="UTF-8"?>
<extended>
<info="1">Eerste startup</id>
<info="2">Reboot machine</id>
<info="3">Connection lost</id>
</extended>


Gewenste resultaat
result.xml:
code:
1
2
3
4
<messages>
<message><id>0</id><info>Reboot Machine</info><duration>107</duration></message>
<message><id>0</id><info>Eerste startup</info><duration>1</duration></message>
</messages>


de info tag uit log.xml wordt ingevuld met extra informatie uit extrainfo.xml
Deze informatie moet weergegeven worden op een pagina. Het bestand result.xml moet in feite niet aangemaakt worden? Als op de webpagina de extra info weergegeven wordt, is dit voldoende.


Mijn eigen probeersel:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:variable name="codes" select="document('extendedinfo.xml')" />

   <xsl:template match="/messages">
      <xsl:element name="messages">
         <xsl:apply-templates/>
      </xsl:element>
   </xsl:template>
 
   <xsl:template match="message">
      <xsl:element name="message">
         <!-- xsl:element name="info"><xsl:value-of select="."/>
</xsl:attribute>
         <xsl:attribute name="info"><xsl:value-of select="$codes/extended/[@id=current()]"/>
</xsl:attribute>
         <!-- create attribute with the value from the codes-file -->
      </xsl:element>
   </xsl:template>
</xsl:stylesheet>

Maar of dit de exacte manier is, weet ik niet. In 1 v/d geraadpleegde bronnen wordt er gesproken om gebruik te maken van Xinclude. Maar volgens Google heb je daarvoor een parser nodig. Dit kan ik niet gebruiken.

Moet ik wel deze manier gebruiken?
Iemand een idee hoe ik het zou moeten oplossen?

1 GOT-topic (3e link onderaan) maakt een nieuw XML bestand aan. Maar de structuur verschilt compleet.

http://www.stylusstudio.com/xmldev/200409/post20170.html
http://www.w3.org/TR/xinclude/
[rml][ XSL / XML] Gegevens uit verschillende XML documenten halen[/rml]
[rml][ XML] Includes en inhoudsopgave[/rml]

[ Voor 14% gewijzigd door Verwijderd op 13-03-2006 10:24 ]


  • André
  • Registratie: Maart 2002
  • Laatst online: 23-02 17:02

André

Analytics dude

Volgens mij kun je dit niet doen zonder een parser, een XSL 'styled' 1 XML en heeft geen mogelijkheden om waardes uit een andere te halen.

Verwijderd

waar werkt die document functie allemaal in? want het is idd geen w3c xpath functie volgens mij

wou je dit trouwens clientside doen (en dan zonder js)? want serverside en met js kan je natuurlijk gewoon de xml dom's in elkaar klussen en een beetje slimme xpath eroverheen doen

dus zeg maar eerst met dom operaties naar:
XML:
1
2
3
4
5
6
7
8
<?xml version="1.0" ?>
<messages>
<message><id>0</id><info>2</info><duration>107</duration></message>
<message><id>0</id><info>1</info><duration>1</duration></message>
<info ord="1">Eerste startup</info>
<info ord="2">Reboot machine</info>
<info ord="3">Connection lost</info>
</messages>
(ff aangepast om conforming te maken)

en dan iets als:
code:
1
//info[@ord = ./info]

(werkende vanuit een message element)

[ Voor 142% gewijzigd door Verwijderd op 13-03-2006 11:03 ]


Verwijderd

Topicstarter
André schreef op maandag 13 maart 2006 @ 10:37:
Volgens mij kun je dit niet doen zonder een parser, een XSL 'styled' 1 XML en heeft geen mogelijkheden om waardes uit een andere te halen.
In de thread [rml][ XSL / XML] Gegevens uit verschillende XML documenten halen[/rml] lukt het nochtans wel zonder parser.

Alles zou client-sided moeten gebeuren. (anders ging ik deze thread in het andere forum gepost hebben ;) )
Ondertussen heb ik ook nog http://www.topxml.com/cod...sp?p=3&id=v20030524142328 gevonden.

Indien het me bv. zou lukken om de 2 XML bestanden samen te voegen, zonder dat er al elementen gemixt zouden zijn.

ong. zoals:
code:
1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" ?>
<messages>
   <message><id>0</id><info>2</info><duration>107</duration></message>
   <message><id>0</id><info>1</info><duration>1</duration></message>
</messages>

<extended>
  <info="1">Eerste startup</id>
  <info="2">Reboot machine</id>
</extended>

Dan zou het met XSLT wel mogelijk moeten zijn om het cijfer door de uitleg te vervangen?

Probleem ligt dus ook in het feit dat ik niet goed weet welke aanpak ik moet nemen.

edit:@mophor: ong. zoals je zei dus ;)

[ Voor 14% gewijzigd door Verwijderd op 13-03-2006 10:53 ]


Verwijderd

als eerste tip zou ik eigenlijk gewoon alles serverside doen, dan ben je ook niet afhankelijk van clientside parsers. XSLT op de client is vaak gewoon niet handig.

dus inderdaad je dom's aan elkaar klussen, eventueel een externe xsl eroverheen doen (makkelijker in onderhoud dan zonder lijkt me) en dan gewoon nette html serveren

als alternatief kan je hetzelfde doen met javascript. 2 xml's en een xsl binnenhalen en transformeren. Vervolgens de resulterende dom in je pagina duwen (wat nog wat kunst en vliegwerk vereist als je een xml dom in een html dom wil mergen)

edit: hmz, document() functie is toch wel een standaard (http://www.w3.org/TR/xslt20/#add-func)
maar even goed zou ik de boel serverside doen (maar het scheelt je dus wat dom geknutsel)

[ Voor 16% gewijzigd door Verwijderd op 13-03-2006 11:26 ]


Verwijderd

Topicstarter
UPDATE
Dankzij de bovenstaande comments is het me gelukt om 2 xml docs te mergen dankzij document(). Nu ben ik al een stap dichter bij de oplossing :)

Nu staan beide XML documenten in 1 pagina.

Situatie nu:
code:
1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" ?>
<messages>
   <message><id>0</id><info>2</info><duration>107</duration></message>
   <message><id>0</id><info>1</info><duration>1</duration></message>
</messages>

<extended>
  <info id="1">Eerste startup</info>
  <info id="2">Reboot machine</info>
</extended>

Vraag:
Hoe kan ik in XSL de cijfer waarde veranderen door de extended informatie?

Belangrijkste stuk code hier c/p:
PHP:
4
5
6
7
8
9
10
11
12
13
<xsl:template match="/">
  
      <xsl:for-each select="messages/message">
             <td class="datacol_0"><xsl:value-of select="timestamp" /></td>
             <td class="datacol_1"><xsl:value-of select="info" /></td> 
             <td class="datacol_2"><xsl:value-of select="duration" /></td>
             </tr>
      </xsl:for-each>
  </table>
 </xsl:template>


Nu zou ik in lijn 8 terug een for-each select moeten invoegen?

[ Voor 26% gewijzigd door Verwijderd op 13-03-2006 13:45 ]


Verwijderd

vervang eens
code:
1
<xsl:value-of select="info" />
door
code:
1
<xsl:value-of select="//info[@id = ./info]" />

tenminste, dat lijkt me op het eerste gezicht te moeten werken.
verder is je xml niet valid he, er mag maar 1 rootelement zijn (dus als het al werkt ziet de xslt waarschijnlijk je extended element niet. Zet er dus nog ff wat omheen.
Pagina: 1