[XSL / XML] Gegevens uit verschillende XML documenten halen

Pagina: 1
Acties:
  • 223 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

Anoniem: 73920

Topicstarter
Ik ben, op vraag van mijn werkgever, een stylesheet (XSL) aan het ontwerpen om data uit XML bestanden te selecteren en samen te vatten. Tot hier toe lukt alles goed, tot mijn verbazing (ik ben namelijk apotheker, geen IT-er). Ik vraag me nu echter af of het volgende mogelijk is :

Het originele document bevat :

...
<vorm>251</vorm>
...

Deze vorm komt overeen met een bepaalde farmaceutische vorm. Ik zou nu de code moeten vinden waarmee ik gegevens uit een tweede XML bestand kan halen, dat het volgende bevat :

...
<250>Tablet</250>
<251>Suppo</251>
...

Waardoor dus in het uiteindelijke bestand de geneesmiddelvorm automatisch wordt ingevuld.

Ik heb alle tutorials en google uitvoerig bekeken, maar vind niet direct iets hiervoor. :?

Acties:
  • 0 Henk 'm!

  • stfn345
  • Registratie: Januari 2000
  • Laatst online: 00:30
ik denk dat je nog iets meer nodig hebt dan alleen xsl en xml.. je zal waarschijnlijk iets meer logica aan moeten brengen, maar pin me er niet op vast.

Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
met de XSL functie document() kun je een (deel van) een XML document selecteren vanuit het XSL proces op een ander XML document.

http://www.zvon.org/xxl/X...ut/function_document.html

Acties:
  • 0 Henk 'm!

  • tech-no-logical
  • Registratie: December 2000
  • Laatst online: 30-05 22:08
ideaal is 't niet, maar misschien kun je de 'document' functie gebruiken. zie :

http://www.zvon.org/xxl/X...ut/function_document.html

(de volledige (framed) XSLT reference is hier : http://www.zvon.org/xxl/XSLTreference/Output/ )

edit:
en ook exact dezelfde link geven :)

[ Voor 14% gewijzigd door tech-no-logical op 16-03-2005 23:19 ]


Acties:
  • 0 Henk 'm!

  • tjerkw
  • Registratie: September 2004
  • Laatst online: 04-04-2024
Denk dat je zoiets bedoeld:

goot dit xsl bestandje (nog niet bug-free) samen met de <vorm>232</vorm> xml file
and zorgt ervoor dat variabele fileB het <250>Tablet</250> xml bestand wijst.

code:
1
2
3
4
5
6
7
8
9
10
11
12
<xsl:stylesheet>

<xsl:var name="fileB" value="document('/path/naar/1.xml')"/>

<xsl:template match="vorm">
  <xsl:element name="{node-name(.)}">
    <xsl:value-of select="$fileB/*[name()=.]"/>
  </xsl:element>
</xsl:template>


</xsl:stylesheet>

Tjerk W


Acties:
  • 0 Henk 'm!

  • joopst
  • Registratie: Maart 2005
  • Laatst online: 01-10-2024
Mijn xmlspy zegt dat je geen cijfers mag gebruiken als element-namen in xml.
vandaar dat in mijn voorbeeld de elementnamen iets anders zijn, maar voor de logica van de transformatie maakt het niet zoveel uit.

Voor de duidelijkheid heb ik 2 bronbestanden gemaakt en 1 transformatie.

bronbestand 1 (vormen.xml):
code:
1
2
3
4
5
<?xml version="1.0" encoding="UTF-8"?>
<vormen>
   <vorm>250</vorm>
   <vorm>251</vorm>
</vormen>


bronbestand 2 (code.xml):
code:
1
2
3
4
5
<?xml version="1.0" encoding="UTF-8"?>
<codes>
   <code id="250">Tablet</code>
   <code id="251">Suppo</code>
</codes>


transformatie (merge.xsl):
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
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <!-- this xslt can be applied to the 'vormen.xml' .. it will merge with codex.xml -->
   <!--  
      this variable holds the entiry second document .. the codes.xml
   -->
   <xsl:variable name="codes" select="document('codes.xml')" />

   <!-- 
      root template 
      creates the parent element 'vormen'
   -->
   <xsl:template match="/vormen">
      <xsl:element name="vormen">
         <xsl:apply-templates/>
      </xsl:element>
   </xsl:template>
   <!-- 
      creates a new 'vorm'-element in the output stream
      and merges the value from 'codes.xml' as an extra attribute
    -->
   <xsl:template match="vorm">
      <xsl:element name="vorm">
         <xsl:attribute name="id"><xsl:value-of select="."/></xsl:attribute>
         <!-- create attribute with the value from the codes-file -->
         <xsl:attribute name="code"><xsl:value-of select="$codes/codes/code[@id=current()]"/></xsl:attribute>
      </xsl:element>
   </xsl:template>
</xsl:stylesheet>


dit levert als output:
code:
1
2
3
4
5
<?xml version="1.0" encoding="UTF-16"?>
<vormen>
   <vorm id="250" code="Tablet" />
   <vorm id="251" code="Suppo" />
</vormen>


wil je toch op elementnaam gaan verglijken, dan zul je zoals hierboven gezegd met de 'name' functie aan de slag moeten.

handig om in je bookmarks te hebben als je met xslt's aan de slag gaat:
http://www.dpawson.co.uk/xsl/sect2/sect21.html
http://www.w3.org/TR/xslt
http://www.w3.org/TR/xpath

mijn favo xml/xsl editor: xmlspy (http://www.altova.com/products_ide.html)

[ Voor 19% gewijzigd door joopst op 17-03-2005 09:16 . Reden: output toegevoegd ]


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Je zou ook met behulp van xinclude meerdere documenten kunnen samenvoegen. Maar met document() kan het ook goed zoals al gezegd.

Noushka's Magnificent Dream | Unity

Pagina: 1