Subject: Re: splittingNode-set2
From: Mukul Gandhi <mukul_gandhi@xxxxxxxxx>
Date: Mon, 9 Aug 2004 08:51:39 -0700 (PDT)
|
Hi Manousos,
Please try this XSL. It uses nodeset extension
function.
<?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:variable name="root" select="/" />
<xsl:template match="/ROWSET">
<set>
<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="$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>
</set>
</xsl:template>
</xsl:stylesheet>
Regards,
Mukul
--- mankar@xxxxxxxxxxxxxxx wrote:
> Hallo,
>
> Let me please rephrase my question concerning the
> recursive splitting of a
> particular node set, in order to make it less
> obscure.
>
> I have this source xml
>
> <?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>3</ELEM_INFO_ITEM>
>
> <ELEM_INFO_ITEM>2003</ELEM_INFO_ITEM>
>
> <ELEM_INFO_ITEM>50</ELEM_INFO_ITEM>
>
>
> <ELEM_INFO_ITEM>8</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> position 3
>
> <ORDINATES_ITEM>57</ORDINATES_ITEM>
>
> <ORDINATES_ITEM>76</ORDINATES_ITEM>
>
> <ORDINATES_ITEM>78</ORDINATES_ITEM>
>
> <ORDINATES_ITEM>56</ORDINATES_ITEM>
>
> <ORDINATES_ITEM>23</ORDINATES_ITEM> position 8
>
> <ORDINATES_ITEM>32</ORDINATES_ITEM>
> </ORDINATES>
> </SHAPE>
> </ROW>
> </ROWSET>
>
> I want to use the ELEM_INFO_ITEM[position() mod 3 =
> 1][position() > 1]
> element's values, which are for this particular
> example 3 and 8, as the
> appropriate positions to split the ORDINATES_ITEM
> node set into two
> separate nodes-sets.I mean select ORDINATE_ITEM
> elements from position 3
> to 7 as children of an interior element and
> ORDINATE_ITEM elements from
> position 8 to the last as children of another
> interior element.
> The desired output should look like:
>
> <set>
> <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>
> </interior>
> <interior>
> <ORDINATES_ITEM>23</ORDINATES_ITEM>
> <ORDINATES_ITEM>32</ORDINATES_ITEM>
> </interior>
> </set>
>
>
> This is easy to manage, when the source xml is
> always the same, but it is
> not.It is generated dynamically and the total number
> of ELEM_INFO_ITEM
> elements is different each time.This number is
> always multiple of three, (9
> in this example) and cannot be less than six.This
> means that the number of
> the generated interior elements also varies and
> depends on the number of
> ELEM_INFO_ITEM elements.
>
> To be more specific i want, depending on my source
> xml, to generate as many
> interior elements as the
> ELEM_INFO_ITEM[position()mod3=1][position()> 1]
> are, and i get to do this using something
> like:
>
> <xsl:for-each
>
select="ROWSET/ROW/SHAPE/ELEM_INFO/ELEM_INFO_ITEM[position()mod3=1][position()
> >1]">
> <interior>...</interior>
> </xsl:for-each>
>
> If i for example, had another source xml identical
> with the first but with
> the three last ELEM_INFO_ITEM elements missing, the
> previous code would
> generate exactly one interior element, as i wish it
> to be.
>
> The hard part is to select the appropriate
> ORDINATE_ITEM nodes and pass
> them as children to the relevant interior
> element.Can i automate this task
> through xslt code?
> I mean, since the source is not always the same how
> can i recursively
> specify that the first interior element should
> always contain ORDINATE_ITEM
> elements whose position is greater than or equal to
> ELEM_INFO_ITEM[position()mod3=1][2] and less than
> ELEM_INFO_ITEM[position()mod3=1][3],
> and the second interior element should always
> contain ORDINATE_ITEM
> elements whose position is greater than or equal to
> ELEM_INFO_ITEM[position()mod3=1][3] and less than
> ELEM_INFO_ITEM[position()mod3=1][4] etc.
>
> How can i do this, since i can't know beforehand,
> for example if an element
> ELEM_INFO_ITEM[position()mod3=1][4]exists, as this
> always depends on my
> source xml.Is there a way to recursively define the
> appropriate ceiling and
> threshold ORDINATE_ITEM position for each sequential
> interior element.
>
> Please,let me know if there is a way to obtain
> this.
>
>
> Regards
> Manousos
> Athens
__________________________________
Do you Yahoo!?
Yahoo! Mail - 50x more storage than other providers!
http://promotions.yahoo.com/new_mail
| Current Thread |
- splittingNode-set2
- mankar - 8 Aug 2004 21:18:21 -0000
- Mukul Gandhi - 9 Aug 2004 15:52:25 -0000 <=
- <Possible follow-ups>
- mankar - 9 Aug 2004 16:07:03 -0000
- mankar - 9 Aug 2004 17:04:39 -0000
|
|