Subject: Re: [xsl] Searching in Sub-children from an Array From: Ronan Klyne <ronan.klyne@xxxxxxxxxxx> Date: Wed, 14 Feb 2007 16:58:44 +0000 |
Houman Khorasani wrote: > Hello Everyone, > > A while ago I have asked about the lovely Muenchian method to solve a > simple example. Unfortunately I am stuck with something that should be > straight forward. I greatly would appreciate any input on this: > > > XML Input: > > <tree> > <fruit ID="111"> > <mango ID="333"> > <colour> > <Rate_Structure_Event > ConceptType="Rate_Structure_Event" ID="1"></Rate_Structure_Event> > </colour> > </mango> > <orange ID="222"> > <color>orange</color> > </orange> > </fruit> > <fruit_adjustment> > <color> > <Path> > <Steps>111,333</Steps> > </Path> > <bla>false</bla> > <Rate_Event ConceptType="Rate_Event" > ID="A"></Rate_Event> > <Rate_Event ConceptType="Rate_Event" > ID="B"></Rate_Event> > </color> > </fruit_adjustment> > </tree> > > > > XSLT 2.0: > > <?xml version="1.0" encoding="UTF-8"?> > <xsl:stylesheet version="2.0" > xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> > > <xsl:key name="step" match="fruit_adjustment/color//Rate_Event" > use="../Path/Steps"/> > > <xsl:template match="*"> > <xsl:copy> > <xsl:copy-of select="@*"/> > <xsl:apply-templates/> > </xsl:copy> > </xsl:template> > > <xsl:template match="fruit_adjustment"/> > > <xsl:template match="colour"> > <xsl:copy-of > select="(key('step',string-join(ancestor-or-self::*[@ID]/@ID,',')),.)[1] > "/> > </xsl:template> > </xsl:stylesheet> > > > > My desired XML output: > > <tree> > <fruit ID="111"> > <mango ID="333"> > <Rate_Event ConceptType="Rate_Event" > ID="A"></Rate_Event> > <Rate_Event ConceptType="Rate_Event" > ID="B"></Rate_Event> > </mango> > <orange ID="222"> > <color>orange</color> > </orange> > </fruit> > </tree> > > > > However I get this XML Output, what do I do wrong? (Only one Rate_Event > is being copied over, why?) > > <tree> > <fruit ID="111"> > <mango ID="333"> > <Rate_Event ConceptType="Rate_Event" ID="A"/> > </mango> > <orange ID="222"> > <color>orange</color> > </orange> > </fruit> > </tree> > > I greatly appreciate your help, > Kind Regards > Houman > > I believe the problem is in this line: <xsl:copy-of select="(key('step',string-join(ancestor-or-self::*[@ID]/@ID,',')),.)[1]"/> The section reading '(key('step',string-join(ancestor-or-self::*[@ID]/@ID,',')),.)' will select all matching Rate_Event nodes correctly, as well as the current node. The predicate at the end '[1]', will then take the first item in this list. I suspect you want to use some kind of conditional here... # r -- Ronan Klyne Business Collaborator Developer Tel: +44 (0)870 163 2555 ronan.klyne@xxxxxxxxxxx www.groupbc.com
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] Searching in Sub-children, Houman Khorasani | Thread | RE: [xsl] Searching in Sub-children, Houman Khorasani |
Re: [xsl] Centering tables in XLFO, Jost Klopfstein | Date | Re: [xsl] Searching in Sub-children, Andrew Welch |
Month |