comp.text.xml
[Top] [All Lists]

Re: Joining XML files?

Subject: Re: Joining XML files?
From: Hermann Peifer
Date: Sun, 06 Jul 2008 18:53:05 +0200
Newsgroups: comp.text.xml


rhino wrote:

Given that these are two separate XML files but that there is some common information, specifically the department number, could I use XSLT to generate a report that shows me each department name followed by the names of the people who work in the department? Something like this:

Marketing
    Department Number: 001
    Location: New York
    Manager: T. Jones

    Other Staff
    E. Humperdinck
    E. Presley
    J. Hendrix

Information Systems
    Department Number: 666
    Location: Toronto
    Manager: M. Slate

    Other Staff
    F. Flintstone
    B. Rubble
    J. Rockhead


Just in case you (or someone else) might be interested in a non-XSLT solution: 
here a small xgawk script that does the job.

$ cat departments.xml
<?xml version="1.0" encoding="UTF-8"?>
<departments>
 <department>
   <department_number>001</department_number>
   <name>Marketing</name>
   <location>New York</location>
   <manager>T. Jones</manager>
 </department>
 <department>
   <department_number>666</department_number>
   <name>Information Systems</name>
   <location>Toronto</location>
   <manager>M. Slate</manager>
 </department>
</departments>

$ cat employees.xml
<?xml version="1.0" encoding="UTF-8"?>
<employees>
 <employee>
   <name>E. Humperdinck</name>
   <department_number>001</department_number>
 </employee>
 <employee>
   <name>E. Presley</name>
   <department_number>001</department_number>
 </employee>
 <employee>
   <name>J. Hendrix</name>
   <department_number>001</department_number>
 </employee>
 <employee>
   <name>F. Flintstone</name>
   <department_number>666</department_number>
 </employee>
 <employee>
   <name>B. Rubble</name>
   <department_number>666</department_number>
 </employee>
 <employee>
   <name>J. Rockhead</name>
   <department_number>666</department_number>
 </employee>
</employees>

$  cat join.awk
@load xml

XMLSTARTELEM {data = "" ; next}
XMLCHARDATA  {data = $0 ; next}

XMLDEPTH == 3 && XMLENDELEM {
       a[XMLENDELEM] = data
       dept = a["department_number"]
}

NR == FNR && XMLENDELEM == "employee" {
       o[dept] = o[dept] sep[dept] "  " a["name"]
       sep[dept] = "\n"
       next
}

XMLENDELEM == "department" {
       print a["name"]
       print "  Department Number: " dept
       print "  Location: " a["location"]
       print "  Manager: " a["manager"]

       print ORS "  Other Staff" ORS o[dept] ORS
}

END {if (XMLERROR) print XMLERROR}

$ xgawk -f join.awk employees.xml departments.xml
Marketing
 Department Number: 001
 Location: New York
 Manager: T. Jones

 Other Staff
 E. Humperdinck
 E. Presley
 J. Hendrix

Information Systems
 Department Number: 666
 Location: Toronto
 Manager: M. Slate

 Other Staff
 F. Flintstone
 B. Rubble
 J. Rockhead

<Prev in Thread] Current Thread [Next in Thread>
Privacy Policy