Re: [xsl] Using a custom variable derived from one XML file to search another and retrieve values of child nodes

Subject: Re: [xsl] Using a custom variable derived from one XML file to search another and retrieve values of child nodes
From: Rob Newman <rlnewman@xxxxxxxx>
Date: Mon, 21 Jul 2008 08:11:48 -0700
Hi Mukul,

Yes - I want to apply the stylesheet to the XML in stations.xml and dataloggers.xml. As I understand it, if you want to process more than one XML file at a time, you need to have a 'feeder' XML file that lists all the XML files you want to transform.

So, I have information in two XML files:

stations.xml
dataloggers.xml

These are listed in feeder.xml, which is then processed by Saxon:

saxon -o output.xml -s feeder.xml convert.xsl

I had already listed the contents of feeder.xml in my original email. Here it is again:


feeder.xml:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<sources>
      <source href="stations.xml" />
      <source href="dataloggers.xml" />
</sources>

Thanks for any help.


Kind regards,
- Rob

On Jul 19, 2008, at 8:59 PM, Mukul Gandhi wrote:

From your stylesheet, it seems, you apply the stylesheet to the XML,
stations.xml (and use other XML files as inputs in between). Is this
what you want to do?

But from your problem description, it seems, you will want to process
the file, feeder.xml from the stylesheet (and take other XMLs as
input) and produce the final output. Is this true?

Also could you please tell the structure of the file, feeder.xml for
multiple scenario (as you said, "so my xsl processor can convert more
than one xml file at a time").

On Sun, Jul 20, 2008 at 6:54 AM, Rob Newman <rlnewman@xxxxxxxx> wrote:
Hi there,

My XSLT processor is Saxon v.9. I have an xml file of a list of station
names:


stations.xml:

<station_list>
 <stations>
    <station name="MONP">
    <station name="MONP2">
    <station name="PFO">
 </stations>
<station_list>

In another xml file I have a series of values associated with a particular
station name (although now the tag is <datalogger>):


dataloggers.xml:

<dataloggerlist>
 <datalogger name="MONP">
    <con>sleeping</con>
    <dlt>280594.003</dlt>
    <rtm>-280553.133</rtm>
 </datalogger>
 <datalogger name="MONP2">
    <con>sleeping</con>
    <dlt>334455.003</dlt>
    <rtm>-483940.133</rtm>
 </datalogger>
 <datalogger name="PFO">
    <con>awake</con>
    <dlt>111111.003</dlt>
    <rtm>-222222.133</rtm>
 </datalogger>
<dataloggerlist>

These are in turn defined in a third xml file (so my xsl processor can
convert more than one xml file at a time):


feeder.xml:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<sources>
      <source href="stations.xml" />
      <source href="dataloggers.xml" />
</sources>

I want to combine them together so that the output looks like the code below
(Aside: I am aware that the station name could be retrieved from
datalogger.xml <datalogger name="XXX">, however I am retrieving a whole
suite of other information that is unique to stations.xml and not pertinent
to this issue):


output.xml:

<Placemark>
 <name>MONP</name>
 <con>sleeping</con>
 <dlt>280594.003</dlt>
 <rtm>-280553.133</rtm>
</Placemark>
<Placemark>
 <name>MONP2</name>
 <con>sleeping</con>
 <dlt>334455.003</dlt>
 <rtm>-483940.133</rtm>
</Placemark>
<Placemark>
 <name>PFO</name>
 <con>awake</con>
 <dlt>111111.003</dlt>
 <rtm>-222222.133</rtm>
</Placemark>

Where name is derived from stations.xml. To get the con, dlt and rtm values
from dataloggers.xml into output.xml I have done the following, although I
am not sure this is close to being right:


(1) Open up stations.xml, and using templates I get the value of the station
name into a variable called $thisSta
(2) Using the value of $thisSta, I then search for the datalogger tag that
has a name attribute that matches $thisSta.
(3) Now I have isolated the station I am interested in from dataloggers.xml
I want to grab some values (con, dlt, rtm).


snippet of convert.xsl where I am trying to achieve this:

<xsl:template match="station">
 <Placemark>
    <xsl:variable name="thisSta"><xsl:value-of select="@name"
/></xsl:variable>
    <name><xsl:value-of select="$thisSta" /></name>
    <xsl:template match="document( sources/source/@href,
.)/dataloggerlist/datalogger/@name=$thisSta">
       <con><xsl:value-of select="con" /></con>
       <dlt><xsl:value-of select="dlt" /></dlt>
       <rtm><xsl:value-of select="rtm" /></rtm>
    </xsl:template>
 <Placemark>
</xsl:template>

When I try and process with Saxon, I get the following output:

Error at xsl:template on line 102 of file:convert.xsl:
XTSE0340: XSLT Pattern syntax error at char 0 on line 102 in {document(
sources}:
The only functions allowed in a pattern are id() and key()


The error is the second template match statement. I think I am pretty close
to getting this working, but I have run out of ideas. Can you do what I am
trying to achieve, or is my XPath expression syntax just poorly written?


Thanks in advance,
- Rob

Current Thread