Subject: Re: [xsl] pathDeterminationByGlobalVariable From: Mukul Gandhi <mukul_gandhi@xxxxxxxxx> Date: Wed, 11 Aug 2004 08:02:43 -0700 (PDT) |
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
Current Thread |
---|
<- Previous | Index | Next -> |
---|---|---|
[xsl] pathDeterminationByGlobalVari, mankar | Thread | Re: [xsl] pathDeterminationByGlobal, mankar |
Re: [xsl] regexs, grouping (?) and , Jeni Tennison | Date | Re: [xsl] Match on Element Value?, David Carlisle |
Month |