|
[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: pathDeterminationByGlobalVariable
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() > 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() < last()">
<xsl:variable name="b"
select="following-sibling::x[1]"/>
<interior>
<xsl:copy-of
select="$row//ORDINATES_ITEM[(position() >= $a) and
(position() < $b) ]"/>
</interior>
</xsl:if>
<xsl:if test="position() = last()">
<interior>
<xsl:copy-of
select="$row//ORDINATES_ITEM[position() >= $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() > 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() < last()">
>
> <xsl:variable name="b"
> select="following-sibling::x[1]" />
> <interior>
> <xsl:copy-of
> select="$root//ORDINATES_ITEM[(position() > ($a -
> 1)) and (position() < $b) ]" />
> </interior>
> </xsl:if>
> <xsl:if test="position() = last()">
> <interior>
> <xsl:copy-of
> select="$root//ORDINATES_ITEM[position() > ($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() > 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() > 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() < last()">
>
> <xsl:variable name="b"
> select="following-sibling::x[1]" />
> <interior>
> <xsl:copy-of
>
select="$root/ROWSET/ROW/SHAPE/ORDINATES/ORDINATES_ITEM[(position()
> >
> ($a -
> 1)) and (position() < $b) ]" />
> </interior>
> </xsl:if>
> <xsl:if test="position() = last()">
> <interior>
> <xsl:copy-of
>
select="$root/ROWSET/ROW/SHAPE/ORDINATES/ORDINATES_ITEM[position()
> > ($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
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|

Cart








