[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

temporary merge of multiple xml files for processing

Subject: temporary merge of multiple xml files for processing
From: "Matt Adams" <mattad@xxxxxxxxx>
Date: Sat, 04 Dec 2004 12:05:16 +0100
merge multiple xml files
Hello Jay,

your answer seems not to be a solution. Let's modify the scenario so that
the problem becomes clear:

first.xml:
<myelem>
   <subelem name="karl" age="10" />
   <subelem name="paul" age="12" />
   <otherfile name="second.xml" />
</myelem>

second.xml:
<parts>
  <subelem name="peter" age="13" />
  <subelem name="tom"   age="12" />
</parts>

Now I want to find out e.g. how many persons have the same age
as the currently inspected subelem.
According to your suggestion I should write something like:

<xsl:template match="/">
  <xsl:apply-templates select="/myelem/subelem"/>
  <xsl:apply-templates select="document('second.xml')/parts/subelem"/>
</xsl:template>

<xsl:template match="subelem">
  age=<xsl:value-of select="./@age" />
  number=<xsl:value-of select="count(//subelem[@age = ./@age])" />
</xsl:template>

would yield:
age=10 number=1
age=12 number=1
age=13 number=1
age=12 number=1

but what I want is:
age=10 number=1
age=12 number=2
age=13 number=1
age=12 number=2

The problem is that your solution looks only into ONE (=the current) xml file
but not
into all files simultaneously !
Again, how can I (temporarily) integrate all
referred xml files into the first, "main" xml file?

Matt

>How can I insert an external xml file into a given first xml file
>and start then processing the target xml as base for xpath expressions?
>Seems difficult question but isn't. Assume the following sample:
>
>first.xml:
><myelem>
>   <subelem aaa="1" />
>   <subelem aaa="2" />
>   <otherfile name="second.xml" />
></myelem>
>
>second.xml:
><parts>
>  <subelem aaa="3" />
>  <subelem aaa="4" />
></parts>
>
>mysample.xslt:
>....
><xsl:replaceotherfileby select="document(//otherfile/@name)" />
><!-- temporary tree in memory should be now:
><myelem>
>   <subelem aaa="1" />
>   <subelem aaa="2" />
>   <parts>
>     <subelem aaa="3" />
>     <subelem aaa="4" />
>   </parts>
></myelem>
>-->
><xsl:for-each ... select="//subelem">
>   <xsl:value-of select="./@aaa" />
></xsl:for-each>
>
>output:
>1
>2
>3
>4
>
>How do I code the function here called "replaceotherfileby"?
>
>Second related question: Suppose in first.xml and second.xml
>different prefixes are used for the same namespace.
>Is your solution a pure textual replacement or are
>the prefixes adjusted according to the refering common
>namespace as well?
>
>Thank you
>Matt
>---
>Date: Fri, 3 Dec 2004 12:52:05 -0600
>To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
>From: JBryant@xxxxxxxxx
>Subject: Re:  including external XML file and process whole new tree
>
>I think you may be making things overly complex (or perhaps I
>misunderstand your goals). You can use apply-templates to insert result
>elements from another document into the current result tree. So, the
>following would work:
>
><xsl:apply-templates select="document(//otherfile/@name)//subelem"/>
>
>Then toss the for-each and have a template for match="subelem".
>
>You could replace //subelem with the full path from the root of the
>inserted document to subelem. In your example, that would be
>/parts/subelem. I assume that your example is a fragment of a much bigger
>document, in which you might not know the full path, so // will do for
>that case.
>
>The following stylesheet works on Saxon
>
><?xml version="1.0" encoding="UTF-8"?>
><xsl:stylesheet version="2.0"
>xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
>
>   <xsl:template match="/">
>     <xsl:apply-templates select="/myelem/subelem"/>
>     <xsl:apply-templates select="document('test2.xml')/parts/subelem"/>
>   </xsl:template>
>
>   <xsl:template match="subelem">
>     <xsl:value-of select="@aaa"/>
>   </xsl:template>
>
></xsl:stylesheet>
>
>A couple caveats: In this case, the elements appear in sorted order
>because of the order of the elements in the file and the order of the
>apply-template statements. If you can't control the order of things in the
>input documents, you'll need to add sorting to the stylesheet. Also, with
>Saxon (8.1.1), I got all the output on one line. That's not a problem if
>you are wrapping your output in tags (HTML or XML), but it's a problem if
>you are relying on line breaks. As you can see, I also hardcoded the
>second file's name, just to save myself a bit of time.
>
>HTH
>
>Jay Bryant
>Bryant Communication Services
--
___________________________________________________________
Sign-up for Ads Free at Mail.com
http://promo.mail.com/adsfreejump.htm

Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.