Re: [xsl] Searching in Sub-children from an Array

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
On 2/14/07, Houman Khorasani <Houman.Khorasani@xxxxxxxxxxx> 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>


The line:

<xsl:copy-of select="(key('step',string-join(ancestor-or-self::*[@ID]/@ID,',')),.)[1]"/>

...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.

In order to copy the entire contents of the key, you could do:

(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