xsl-list
[Top] [All Lists]

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

2007-02-14 09:59:23
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::*[(_at_)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

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



I believe the problem is in this line:
<xsl:copy-of
select="(key('step',string-join(ancestor-or-self::*[(_at_)ID]/@ID,',')),.)[1]"/>

The section reading
'(key('step',string-join(ancestor-or-self::*[(_at_)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(_dot_)klyne(_at_)groupbc(_dot_)com
www.groupbc.com

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>