Re: [xsl] combining 2 different XML files within the same XSLT

Subject: Re: [xsl] combining 2 different XML files within the same XSLT
From: Wendell Piez <wapiez@xxxxxxxxxxxxxxxx>
Date: Tue, 27 Aug 2002 14:48:01 -0400
Todd,

There are any number of approaches to do what you're describing: I'll just describe a simple quick-and-dirty "forced merge".

You name the two files in a separate config or "driver" file:

<files>
  <file>file1.xml</file>
  <file>file2.xml</file>
</files>

This will be the source file for your transformation, in which you do something like:

<xsl:variable name="mergedset" select="document(/files/file)"/>

<xsl:template match="/">
  <!-- matching on the root node of your config file -->
  <apps>
    <xsl:apply-templates select="$mergedset" mode="process"/>
    <!-- this mode just bumps you off the default so you can match the roots
         of your merging documents separately -->
    <!-- you need to wrap them in your <apps> here since there'll be more than
         one root and you don't want more than one <apps> -->
  </apps>
</xsl:template>

<xsl:template match="/" mode="process">
  <!-- this template will now match your merging documents' roots -->
  <xsl:apply-templates select="//date">
  <!-- since your criterion is your date, we'll go straight to them -->
    <xsl:sort type="number"/>
    <!-- let's sort em while we're at it -->
  </xsl:apply-templates>
</xsl:template>

<xsl:template match="date">
  <xsl:if test="
   ...do your test against your criterion of what to include;
                it could of course be parameterized
   ">
...
   this is where the action will happen: you'll probably go up a step
   (for-each select=".."), but there's lots of ways to skin this cat:
   the point is you'll build your <app> here and fill it with whatever
   you've got
...
  </xsl:if>
</xsl:template>

I am trying to create a NEW list of XML nodes from either file that meet a
certain criteria.

BTW (small point), as an English teacher I can't help but urge you to understand that "criteria" is a plural noun in our fine language (the word comes from Greek), and what you mean to say is "nodes from either file that meet a certain criterion"... :->


Note also that what I'm outlining is a *separate pass* (a pre-process) to create a list of <app> elements, not itself suitable for display. Handle that either in a second pass, or combine the logic (this is not prima facie impossible) to create your output format with this merging logic, skipping the apps/app stage altogether.

I hope that helps!

Cheers,
Wendell

At 12:32 PM 8/27/2002, you wrote:
I have 2 different XML files that have different node structure, but similar
information (both contain date related information)

I am trying to create a NEW list of XML nodes from either file that meet a
certain criteria.

EXAMPLE FILE 1

<events>
<event id='1'>
    <date>20020812</date>
    <name>event1</name>
    <fullname>big time event</fullname>
</event>
<event id='2'>
    <date>20020813</date>
    <name>event2</name>
    <fullname>mid time event</fullname>
</event>
<event id='3'>
    <date>20020815</date>
    <name>event3</name>
    <fullname>small time event</fullname>
</event>
</events>

EXAMPLE FILE 2
<games>
<game id='1'>
    <date>20020813</date>
    <name>game1</name>
    <opponent>team b</opponent>
    <time>14:00</time>
</game>
<game id='2'>
    <date>20020818</date>
    <name>game2</name>
    <opponent>team c</opponent>
    <time>12:00</time>
</game>
</games>

is there a way with a single XSLT file to get all the nodes from each file
that meet a certain criteria and put their information into a new XML node
structure?

EXAMPLE COMBINED CREATED NODELIST (criteria: date between 20020814 and
20020821)

<apps>
<app type="event" id="3">
    <date>20020815</date>
    <name>event3</name>
    <fullname>small time event</fullname>
</app>
<app type="game" id="2">
    <date>20020818</date>
    <name>game2</name>
    <opponent>team c</opponent>
    <time>12:00</time>
</app>
</apps>

this nodelist could then be sorted and displayed (the display XSLT routine
would handle the different @type nodes [game / event] so that even though
there would be different information (ie. fullname, opponent, time) the
combined list could be sorted and displayed

but I can't figure how to create this COMBINED LIST within the XSLT file

- Todd

XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list


======================================================================
Wendell Piez                            mailto:wapiez@xxxxxxxxxxxxxxxx
Mulberry Technologies, Inc.                http://www.mulberrytech.com
17 West Jefferson Street                    Direct Phone: 301/315-9635
Suite 207                                          Phone: 301/315-9631
Rockville, MD  20850                                 Fax: 301/315-8285
----------------------------------------------------------------------
  Mulberry Technologies: A Consultancy Specializing in SGML and XML
======================================================================


XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list



Current Thread