[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Re: pathDeterminationByGlobalVariable

Subject: Re: pathDeterminationByGlobalVariable
From: Mukul Gandhi <mukul_gandhi@xxxxxxxxx>
Date: Wed, 11 Aug 2004 08:02:43 -0700 (PDT)
xsl if descendant
Hi Manousos,
  Please try this XSL -

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xalan"
exclude-result-prefixes="xalan">

<xsl:output method="xml" indent="yes"/>
	
<xsl:template match="/ROWSET">
  <set>
    <xsl:for-each select="ROW">
      <xsl:variable name="row" select="."/>
	<polygon>
	  <xsl:variable name="rtf">
	    <xsl:for-each
select="descendant::ELEM_INFO_ITEM">
	      <xsl:if test="((position() mod 3) = 1) and
(position() &gt; 1)">
		<x>
		 <xsl:value-of select="."/>
		</x>
	      </xsl:if>
	    </xsl:for-each>
	  </xsl:variable>
	  <xsl:for-each select="xalan:nodeset($rtf)/x">
	    <xsl:variable name="a" select="."/>
	      <xsl:if test="position() &lt; last()">
	        <xsl:variable name="b"
select="following-sibling::x[1]"/>
		  <interior>
		    <xsl:copy-of
select="$row//ORDINATES_ITEM[(position() &gt;= $a) and
(position() &lt; $b) ]"/>
		  </interior>
	      </xsl:if>
	      <xsl:if test="position() = last()">
		<interior>
	  	  <xsl:copy-of
select="$row//ORDINATES_ITEM[position() &gt;= $a]"/>
		</interior>
	      </xsl:if>
	    </xsl:for-each>
	</polygon>
    </xsl:for-each>
</set>
</xsl:template>
	
</xsl:stylesheet>

Regards,
Mukul

--- mankar@xxxxxxxxxxxxxxx wrote:
> 
> Hallo,
> 
> I am using this xslt code:
> 
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
> 
> <xsl:output method="xml" indent="yes"/>
> 
> <xsl:variable name="root" select="/" />
> 
> <xsl:template match="ROWSET">
>   <set>
>   <xsl:for-each select="ROW">
>   <polygon>
>      <xsl:variable name="rtf">
>        <xsl:for-each
> select="descendant::ELEM_INFO_ITEM">
>          <xsl:if test="((position() mod 3) = 1) and
> (position() &gt; 1)">
>            <x>
>              <xsl:value-of select="." />
>            </x>
>          </xsl:if>
>        </xsl:for-each>
>      </xsl:variable>
> 
>      <xsl:for-each select="$rtf/x">
>        <xsl:variable name="a" select="." />
>        <xsl:if test="position() &lt; last()">
> 
>          <xsl:variable name="b"
> select="following-sibling::x[1]" />
>            <interior>
>            <xsl:copy-of
> select="$root//ORDINATES_ITEM[(position() &gt; ($a -
> 1)) and (position() &lt; $b) ]" />
>          </interior>
>       </xsl:if>
>       <xsl:if test="position() = last()">
>          <interior>
>            <xsl:copy-of
> select="$root//ORDINATES_ITEM[position() &gt; ($a -
> 1)]" />
>          </interior>
>       </xsl:if>
>       </xsl:for-each>
> </polygon>
> </xsl:for-each>
>   </set>
> </xsl:template>
> 
> </xsl:stylesheet>
> 
> 
> to transform this xml source:
> 
> 
> <?xml version="1.0" encoding="ISO-8859-7"?>
> <ROWSET>
>       <ROW num="1">
>             <SHAPE>
>                   <ELEM_INFO>
>                        
> <ELEM_INFO_ITEM>1</ELEM_INFO_ITEM>
>                        
> <ELEM_INFO_ITEM>1003</ELEM_INFO_ITEM>
>                        
> <ELEM_INFO_ITEM>50</ELEM_INFO_ITEM>
>                        
> <ELEM_INFO_ITEM>5</ELEM_INFO_ITEM>
>                        
> <ELEM_INFO_ITEM>2003</ELEM_INFO_ITEM>
>                        
> <ELEM_INFO_ITEM>50</ELEM_INFO_ITEM>
>                        
> <ELEM_INFO_ITEM>9</ELEM_INFO_ITEM>
>                        
> <ELEM_INFO_ITEM>2003</ELEM_INFO_ITEM>
>                        
> <ELEM_INFO_ITEM>50</ELEM_INFO_ITEM>
>                        
> <ELEM_INFO_ITEM>12</ELEM_INFO_ITEM>
>                        
> <ELEM_INFO_ITEM>2003</ELEM_INFO_ITEM>
>                        
> <ELEM_INFO_ITEM>50</ELEM_INFO_ITEM>
>                   </ELEM_INFO>
>                   <ORDINATES>
>                        
> <ORDINATES_ITEM>52</ORDINATES_ITEM>
>                        
> <ORDINATES_ITEM>45</ORDINATES_ITEM>
>                        
> <ORDINATES_ITEM>54</ORDINATES_ITEM>
>                        
> <ORDINATES_ITEM>57</ORDINATES_ITEM>
>                        
> <ORDINATES_ITEM>76</ORDINATES_ITEM>
>                        
> <ORDINATES_ITEM>78</ORDINATES_ITEM>
>                        
> <ORDINATES_ITEM>56</ORDINATES_ITEM>
>                        
> <ORDINATES_ITEM>1</ORDINATES_ITEM>
>                        
> <ORDINATES_ITEM>2</ORDINATES_ITEM>
>                        
> <ORDINATES_ITEM>3</ORDINATES_ITEM>
>                        
> <ORDINATES_ITEM>4</ORDINATES_ITEM>
>                        
> <ORDINATES_ITEM>5</ORDINATES_ITEM>
>                        
> <ORDINATES_ITEM>6</ORDINATES_ITEM>
>                   </ORDINATES>
>             </SHAPE>
>       </ROW>
> </ROWSET>
> 
> 
> into this output xml:
> 
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <set>
>    <polygon>
>       <interior>
>          <ORDINATES_ITEM>76</ORDINATES_ITEM>
>          <ORDINATES_ITEM>78</ORDINATES_ITEM>
>          <ORDINATES_ITEM>56</ORDINATES_ITEM>
>          <ORDINATES_ITEM>1</ORDINATES_ITEM>
>       </interior>
>       <interior>
>          <ORDINATES_ITEM>2</ORDINATES_ITEM>
>          <ORDINATES_ITEM>3</ORDINATES_ITEM>
>          <ORDINATES_ITEM>4</ORDINATES_ITEM>
>       </interior>
>       <interior>
>          <ORDINATES_ITEM>5</ORDINATES_ITEM>
>          <ORDINATES_ITEM>6</ORDINATES_ITEM>
>       </interior>
>    </polygon>
> </set>
> 
> 
> As you can see, the previous xslt, creates a polygon
> element for each row,
> which contains as
> many interior elements as ELEM_INFO_ITEM elements
> are, in each row, with
> position :
> ((position() mod 3) = 1) and
> (position() &gt; 1)
> 
> Each interior element contains ORDINATES_ITEM
> elements between two
> threshold positions, which
> are selected specifically from ELEM_INFO_ITEM
> elements's values with the
> previously mentioned,
> specific positions, using local variables.
> 
> The global variable root is used in order to
> determine the appropriate path
> inside the inner loop
> and select the relevant ORDINATE_ITEM nodes for each
> interior.
> 
> I now want to extend the particular xslt code, in
> order to obtain the same
> output, by applying
> it on another similar source xml with more than one
> rows.I think that the
> only modification
> needed for this to work, is the path determination
> to select the
> appropriate ORDINATE_ITEM
> elements of each row, each time. So i keep the rest
> of the code unchanged
> and just alter the part:
> 
> from
> 
> <interior>
>            <xsl:copy-of
> select="$root//ORDINATES_ITEM........
> 
> to
> 
> <interior>
>            <xsl:copy-of
>
select="$root/ROWSET/ROW/SHAPE/ORDINATES/ORDINATES_ITEM........
> 
> so that the selected threshold positions are applied
> to each ROW descendant
> ORDINATE_ITEMS
> and not to all descendant ORDINATES_ITEM beginning
> from the root.
> 
> I don't know why, but it keeps on doing the same
> thing, i mean selects the
> threshold values
> correctly for each ROW, but applies them to all
> ORDINATE_ITEMS elements of
> the source doc
> and not just to the descendant ORDINATE_ITEMS
> elements of each ROW.
> 
> For example:
> 
> having this source:
> 
> <?xml version="1.0" encoding="ISO-8859-7"?>
> <ROWSET>
>       <ROW num="1">
>             <SHAPE>
>                   <ELEM_INFO>
>                        
> <ELEM_INFO_ITEM>1</ELEM_INFO_ITEM>
>                        
> <ELEM_INFO_ITEM>1003</ELEM_INFO_ITEM>
>                        
> <ELEM_INFO_ITEM>50</ELEM_INFO_ITEM>
>                        
> <ELEM_INFO_ITEM>5</ELEM_INFO_ITEM>
>                        
> <ELEM_INFO_ITEM>2003</ELEM_INFO_ITEM>
>                        
> <ELEM_INFO_ITEM>50</ELEM_INFO_ITEM>
>                        
> <ELEM_INFO_ITEM>9</ELEM_INFO_ITEM>
>                        
> <ELEM_INFO_ITEM>2003</ELEM_INFO_ITEM>
>                        
> <ELEM_INFO_ITEM>50</ELEM_INFO_ITEM>
>                        
> <ELEM_INFO_ITEM>12</ELEM_INFO_ITEM>
>                        
> <ELEM_INFO_ITEM>2003</ELEM_INFO_ITEM>
>                        
> <ELEM_INFO_ITEM>50</ELEM_INFO_ITEM>
>                   </ELEM_INFO>
>                   <ORDINATES>
>                        
> <ORDINATES_ITEM>52</ORDINATES_ITEM>
>                        
> <ORDINATES_ITEM>45</ORDINATES_ITEM>
>                        
> <ORDINATES_ITEM>54</ORDINATES_ITEM>
>                        
> <ORDINATES_ITEM>57</ORDINATES_ITEM>
>                        
> <ORDINATES_ITEM>76</ORDINATES_ITEM>
>                        
> <ORDINATES_ITEM>78</ORDINATES_ITEM>
>                        
> <ORDINATES_ITEM>56</ORDINATES_ITEM>
>                        
> <ORDINATES_ITEM>1</ORDINATES_ITEM>
>                        
> <ORDINATES_ITEM>2</ORDINATES_ITEM>
>                        
> <ORDINATES_ITEM>3</ORDINATES_ITEM>
>                        
> <ORDINATES_ITEM>4</ORDINATES_ITEM>
>                        
> <ORDINATES_ITEM>5</ORDINATES_ITEM>
>                        
> <ORDINATES_ITEM>6</ORDINATES_ITEM>
>                   </ORDINATES>
>             </SHAPE>
>       </ROW>
>       <ROW num="2">
>             <SHAPE>
>                   <ELEM_INFO>
>                        
> <ELEM_INFO_ITEM>1</ELEM_INFO_ITEM>
>                        
> <ELEM_INFO_ITEM>1003</ELEM_INFO_ITEM>
>                        
> <ELEM_INFO_ITEM>50</ELEM_INFO_ITEM>
>                        
> <ELEM_INFO_ITEM>3</ELEM_INFO_ITEM>
>                        
> <ELEM_INFO_ITEM>2003</ELEM_INFO_ITEM>
>                        
> <ELEM_INFO_ITEM>50</ELEM_INFO_ITEM>
>                   </ELEM_INFO>
>                   <ORDINATES>
>                        
> <ORDINATES_ITEM>17</ORDINATES_ITEM>
>                        
> <ORDINATES_ITEM>23</ORDINATES_ITEM>
>                        
> <ORDINATES_ITEM>39</ORDINATES_ITEM>
>                        
> <ORDINATES_ITEM>54</ORDINATES_ITEM>
>                        
> <ORDINATES_ITEM>74</ORDINATES_ITEM>
>                        
> <ORDINATES_ITEM>98</ORDINATES_ITEM>
>                   </ORDINATES>
>             </SHAPE>
>       </ROW>
> </ROWSET>
> 
> 
> and apllying the slightly modified xsl:
> 
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
> 
> <xsl:output method="xml" indent="yes"/>
> 
> <xsl:variable name="root" select="/" />
> 
> <xsl:template match="ROWSET">
>   <set>
>   <xsl:for-each select="ROW">
>   <polygon>
>      <xsl:variable name="rtf">
>        <xsl:for-each
> select="descendant::ELEM_INFO_ITEM">
>          <xsl:if test="((position() mod 3) = 1) and
> (position() &gt; 1)">
>            <x>
>              <xsl:value-of select="." />
>            </x>
>          </xsl:if>
>        </xsl:for-each>
>      </xsl:variable>
> 
>      <xsl:for-each select="$rtf/x">
>        <xsl:variable name="a" select="." />
>        <xsl:if test="position() &lt; last()">
> 
>          <xsl:variable name="b"
> select="following-sibling::x[1]" />
>            <interior>
>            <xsl:copy-of
>
select="$root/ROWSET/ROW/SHAPE/ORDINATES/ORDINATES_ITEM[(position()
> &gt;
> ($a -
> 1)) and (position() &lt; $b) ]" />
>          </interior>
>       </xsl:if>
>       <xsl:if test="position() = last()">
>          <interior>
>            <xsl:copy-of
>
select="$root/ROWSET/ROW/SHAPE/ORDINATES/ORDINATES_ITEM[position()
> &gt; ($a
> -
> 1)]" />
>          </interior>
>       </xsl:if>
>       </xsl:for-each>
> </polygon>
> </xsl:for-each>
>   </set>
> </xsl:template>
> 
> </xsl:stylesheet>
> 
> 
> I am getting this result:
> 
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <set>
>    <polygon>
>       <interior>
>          <ORDINATES_ITEM>76</ORDINATES_ITEM>
>          <ORDINATES_ITEM>78</ORDINATES_ITEM>
>          <ORDINATES_ITEM>56</ORDINATES_ITEM>
>          <ORDINATES_ITEM>1</ORDINATES_ITEM>
>          <ORDINATES_ITEM>74</ORDINATES_ITEM>
>          <ORDINATES_ITEM>98</ORDINATES_ITEM>
>       </interior>
>       <interior>
>          <ORDINATES_ITEM>2</ORDINATES_ITEM>
>          <ORDINATES_ITEM>3</ORDINATES_ITEM>
>          <ORDINATES_ITEM>4</ORDINATES_ITEM>
>       </interior>
>       <interior>
>          <ORDINATES_ITEM>5</ORDINATES_ITEM>
>          <ORDINATES_ITEM>6</ORDINATES_ITEM>
>       </interior>
>    </polygon>
>    <polygon>
>       <interior>
>          <ORDINATES_ITEM>54</ORDINATES_ITEM>
>          <ORDINATES_ITEM>57</ORDINATES_ITEM>
>          <ORDINATES_ITEM>76</ORDINATES_ITEM>
>          <ORDINATES_ITEM>78</ORDINATES_ITEM>
>          <ORDINATES_ITEM>56</ORDINATES_ITEM>
>          <ORDINATES_ITEM>1</ORDINATES_ITEM>
>          <ORDINATES_ITEM>2</ORDINATES_ITEM>
>          <ORDINATES_ITEM>3</ORDINATES_ITEM>
>          <ORDINATES_ITEM>4</ORDINATES_ITEM>
>          <ORDINATES_ITEM>5</ORDINATES_ITEM>
>          <ORDINATES_ITEM>6</ORDINATES_ITEM>
>          <ORDINATES_ITEM>39</ORDINATES_ITEM>
>          <ORDINATES_ITEM>54</ORDINATES_ITEM>
>          <ORDINATES_ITEM>74</ORDINATES_ITEM>
>          <ORDINATES_ITEM>98</ORDINATES_ITEM>
>       </interior>
>    </polygon>
> </set>
> 
> The polygon elements are correctly created for each
> row.The number of
> created interior elements
> is also correct for each row.The threshold values
> are also correctly
> selected for each row.
> I mean, i am saying select all ORDINATEs_ITEM
> elemnts from position 5 to
> position 8 as content of
> the first interior element of the first row and it
> does this, but it also
> adds ORDINATE_ITEM elements
> from position 5 to position 8 that belong to the
> second row. The same thing
> happens with the
> ORDINATES_ITEM elements which are conetnt of the
> interior element of the
> second row.It does not
> just select the ORDINATES_ITEM from position 3 to
> the last as it should be,
> but it also selects
> ORDINATE_ITEM elements from the first row between
> the same positions
> I know the problem is the use of the Global
> variable.I mean it keeps on
> selecting from all root's descendants ORDINATES_ITEM
> elements.I tried
> modifying the value of the global variable as well,
> but i can't still avoid
> this from happening.Does anyone have any idea of how
> to fix this?
> 
> Thanks
> 
> 
> Regards
> Manousos




		
__________________________________
Do you Yahoo!?
New and Improved Yahoo! Mail - Send 10MB messages!
http://promotions.yahoo.com/new_mail 

Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.