[XSL-LIST Mailing List Archive Home]
[By Thread]
[By Date]
[xsl] temporary merge of multiple xml files for processing
Subject: [xsl] temporary merge of multiple xml files for processing From: "Matt Adams" <mattad@xxxxxxxxx> Date: Sat, 04 Dec 2004 12:05:16 +0100 |
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: [xsl] 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 |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] HOW XSLT WILL BE, WHEN XM, Michael Kay | Thread | Re: [xsl] temporary merge of multip, Wendell Piez |
Re: [xsl] What is the shortest expr, Colin Paul Adams | Date | Re: [xsl] Creating nested output fr, George Cristian Bina |
Month |