xsl-list
[Top] [All Lists]

Re: [xsl] build group of elements

2012-06-25 08:52:14
The mistake was in the loop:
 correct is: <xsl:for-each select=".">
now the script works fine!
brg
hh


--- henry human <henry_human(_at_)yahoo(_dot_)de> schrieb am Mo, 25.6.2012:

Von: henry human <henry_human(_at_)yahoo(_dot_)de>
Betreff: Re: [xsl] build group of elements
An: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Datum: Montag, 25. Juni, 2012 15:26 Uhr
here is the xslt and the input data


------------------------Output------------------------------
<xsl:for-each select="DATA/REF">
           
            
    <xsl:variable name="adrTyp"
select="@ref:ADRTYP"/>
    <xsl:variable name="refs"
select="REF"/>
    <xsl:variable name="noOfSegments"
select="xs:integer(max(( '1', xs:string(ceiling(count($refs)
div 5)) )))"/>

    <xsl:for-each select="1 to
$noOfSegments">
        <xsl:variable
name="hope" select="position() * 4"/>
        <L5Segment>
           
<xsl:if test="($refs/CDE)[$hope - 4]">
           
    <_1st_Address_type_Code>
           
        <xsl:value-of
select="$adrTyp"/>
           
    </_1st_Address_type_Code>
           
    <_1st_Reference_Code>
           
        <xsl:value-of
select="($refs/CDE)[$hope - 4]"/>
           
    </_1st_Reference_Code>
           
    <_1st_Reference>
           
        <xsl:value-of
select="($refs/VAL)[$hope - 4]"/>
           
    </_1st_Reference>
           
</xsl:if>
           
<xsl:if test="($refs/CDE)[$hope - 3]">
           
    <_2nd_Address_type>
           
        <xsl:value-of
select="$adrTyp"/>
           
    </_2nd_Address_type>
           
    <_2nd_Reference_Code>
           
        <xsl:value-of
select="($refs/CDE)[$hope - 3]"/>
           
    </_2nd_Reference_Code>
           
    <_2nd_Reference>
           
        <xsl:value-of
select="($refs/VAL)[$hope - 3]"/>
           
    </_2nd_Reference>
           
</xsl:if>
           
<xsl:if test="($refs/CDE)[$hope - 2]">
           
    <_3rd_Address_type>
           
        <xsl:value-of
select="$adrTyp"/>
           
    </_3rd_Address_type>
           
    <_3rd_Reference_Code>
           
        <xsl:value-of
select="($refs/CDE)[$hope - 2]"/>
           
    </_3rd_Reference_Code>
           
    <_3rd_Reference>
           
        <xsl:value-of
select="($refs/VAL)[$hope - 2]"/>
           
    </_3rd_Reference>
           
</xsl:if>
           
<xsl:if test="($refs/CDE)[$hope - 1]">
           
    <_4th_Address_type>
           
        <xsl:value-of
select="$adrTyp"/>
           
    </_4th_Address_type>
           
    <_4th_Reference_Code>
           
        <xsl:value-of
select="($refs/CDE)[$hope - 1]"/>
           
    </_4th_Reference_Code>
           
    <_4th_Reference>
           
        <xsl:value-of
select="($refs/VAL)[$hope - 1]"/>
           
    </_4th_Reference>
           
</xsl:if>

        </L5Segment>
    </xsl:for-each>
</xsl:for-each>


--------------Input---------------
<?xml version="1.0" encoding="UTF-8"?>
    <DATA>   
    
        
        <ref:REF
ref:ADRTYP="FF">
           
<CDE>SRN</CDE>
           
<VAL>4405050008759</VAL>
        </ref:REF>
        <ref:REF
ref:ADRTYP="MM">
           
<CDE>AAA</CDE>
           
<VAL>3378781118759</VAL>
        </ref:REF>
        <ref:REF
ref:ADRTYP="NN">
           
<CDE>BBB</CDE>
           
<VAL>2209094446927</VAL>
        </ref:REF>

        <ref:REF
ref:ADRTYP="BB">
           
<CDE>BBB</CDE>
           
<VAL>4405099999999</VAL>
        </ref:REF>
        <ref:REF
ref:ADRTYP="CC">
           
<CDE>CCC</CDE>
           
<VAL>4444444418759</VAL>
        </ref:REF>
        <ref:REF
ref:ADRTYP="DD">
           
<CDE>DDD</CDE>
           
<VAL>0000000046927</VAL>
        </ref:REF>
        <ref:REF
ref:ADRTYP="EE">
           
<CDE>EEE</CDE>
           
<VAL>2020202020202</VAL>
        </ref:REF>
        <ref:REF
ref:ADRTYP="GG">
           
<CDE>GGG</CDE>
           
<VAL>667676767676</VAL>
        </ref:REF>
        <ref:REF
ref:ADRTYP="JJ">
           
<CDE>JJJ</CDE>
           
<VAL>2828282828282</VAL>
        </ref:REF>
    </DATA>

--- G. Ken Holman <gkholman(_at_)CraneSoftwrights(_dot_)com>
schrieb am So, 24.6.2012:

Von: G. Ken Holman <gkholman(_at_)CraneSoftwrights(_dot_)com>
Betreff: Re: [xsl] build group of elements
An: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com,
xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Datum: Sonntag, 24. Juni, 2012 20:09 Uhr
At 2012-06-24 17:54 +0100, henry
human wrote:
Ken, unfortunatelly the elments in the output has
different prefixes such as:

<_1st_
<_2nd_
<_3rd_
The names must contain the above prefixes
Your script builds only :
<_1_elment
<_1_elment
<_2_elment
<_3_elment

Why do you say this?  Did you not look at the results
I
added to my 
post?  I gave you my evidence that the correct result
is obtained 
with my stylesheet ... look below again and you will
see
that what 
you want is produced using a conforming XSLT 2
processor (in
my case 
I always use Saxon).

Maybe you get incorrect results on your machine, but
it
works as you 
wish on mine.  If you aren't getting what I'm
getting,
then I suggest 
your processor is not supporting the XSLT 2 ordinal=
attribute for 
<xsl:number/>.

. . . . . . . . Ken

--- G. Ken Holman <gkholman(_at_)CraneSoftwrights(_dot_)com>
schrieb am So, 24.6.2012:

Von: G. Ken Holman <gkholman(_at_)CraneSoftwrights(_dot_)com>
Betreff: Re: [xsl] build group of elements
An: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com,
xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Datum: Sonntag, 24. Juni, 2012 17:11 Uhr
At 2012-06-24 15:41 +0100, henry
human wrote:
sorry for my mistake..again the input
xml
data and the
expecting output:
The xml data has many foo elements
(1000).

Just by conjecture, I'm guessing you want
<fooGroup>
to be three groups of three.  You don't
explain the
criteria, but that is the only "meaningful"
interpretation I
can see.  Next time it would help if you
could explain
your requirements when including an example
rather
than make
us guess by looking at your example.

If I've guessed correctly, this is done
easiest
with
adjacent grouping.

I hope this helps.

. . . . . . . . . Ken

~/t/ftemp $ cat henry.xml
<?xml version="1.0" encoding="UTF-8"?>
  <xmldata>
  <ss> s </ss>
  <nn>n </nn>
   <foo>tt</foo>
    <foo>bb</foo>
    <foo>aa</foo>
     <foo>mm</foo>
       
<foo>ll</foo>
       
<foo>nn</foo>
     
   <foo>ff</foo>

    <foo>gg</foo>
   
   <foo>ii</foo>
   <hh>h</hh>
  </xmldata>
~/t/ftemp $ xslt2 henry.xml henry.xsl
<?xml version="1.0" encoding="UTF-8"?>
<fooGroup>
    <_1st_element>

<_1st_element>tt</_1st_element>

<_2nd_element>bb</_2nd_element>

<_3rd_element>aa</_3rd_element>
    </_1st_element>
    <_2nd_element>

<_1st_element>mm</_1st_element>

<_2nd_element>ll</_2nd_element>

<_3rd_element>nn</_3rd_element>
    </_2nd_element>
    <_3rd_element>

<_1st_element>ff</_1st_element>

<_2nd_element>gg</_2nd_element>

<_3rd_element>ii</_3rd_element>
    </_3rd_element>
</fooGroup>~/t/ftemp $
~/t/ftemp $ cat henry.xsl
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
   xmlns:h="urn:X-henry"
exclude-result-prefixes="h"
   version="2.0">

<xsl:output indent="yes"/>

<xsl:template match="xmldata">
   <xsl:for-each-group
select="foo"

   
   group-adjacent="(position()-1) idiv
9">
     <fooGroup>
   
   <xsl:for-each-group
select="current-group()"


group-adjacent="(position()-1) idiv 3">
     
   <xsl:element
name="_{h:ord(position())}_element">
       
   <xsl:for-each
select="current-group()">
         
   <xsl:element
name="_{h:ord(position())}_element">

<xsl:copy-of select="node()"/>

</xsl:element>
       
   </xsl:for-each>
     
   </xsl:element>
   
   </xsl:for-each-group>
     </fooGroup>
   </xsl:for-each-group>
</xsl:template>

<xsl:function name="h:ord">
   <xsl:param name="pos"/>
   <xsl:number value="$pos"
ordinal="1"/>
</xsl:function>

</xsl:stylesheet>
~/t/ftemp $


--
Public XSLT, XSL-FO, UBL and code list classes in
Europe --
Oct 2012
Contact us for world-wide XML consulting and
instructor-led
training
Free 5-hour lecture: http://www.CraneSoftwrights.com/links/udemy.htm
Crane Softwrights Ltd.         
  http://www.CraneSoftwrights.com/s/
G. Ken Holman           
       mailto:gkholman(_at_)CraneSoftwrights(_dot_)com
Google+ profile: https://plus.google.com/116832879756988317389/about
Legal business disclaimers:    http://www.CraneSoftwrights.com/legal



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



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



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