Subject: Re: [xsl] Searching in Sub-children from an Array From: "Andrew Welch" <andrew.j.welch@xxxxxxxxx> Date: Wed, 14 Feb 2007 17:12:51 +0000 |
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>
...will copy the the first node returned from the key, or if no node is returned it will copy the current node. As two nodes are returned from the key, its selecting only the first.
(key('step',string-join(ancestor-or-self::*[@ID]/@ID,',')),.)[position() = (1 to last())]
...but at this point I would separate it out as its getting hacky - put the result of the key into a variable and then test its contents, and choose which to output accordingly.
cheers andrew
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] Searching in Sub-children, Houman Khorasani | Thread | [xsl] Peserving html in xsl:value-o, John Steel |
Re: [xsl] Searching in Sub-children, Ronan Klyne | Date | [xsl] Peserving html in xsl:value-o, John Steel |
Month |