xsl-list
[Top] [All Lists]

Re: restructuring element hierarchy using xslt- complications

2003-09-30 04:27:16
When taking this further i have realised that maybe the problem is more complicate dthan i first thought, see u what u think below::
(apologies for the layout, done in hotmail so may look a little shabby)
the xml file looks like this:

<t>
<het position="1">
<entrydata columnnumber="0">
<text>some more text here</text></entrydata>
</het>
<het position="1.1">
<entrydata columnnumber="1">
<text>some more text here</text></entrydata>
</het>
<het position="1.1.1">
<entrydata columnnumber="2">
<text>text here</text></entrydata>
<entrydata columnnumber="3">
<text>more text here</text></entrydata>
<entrydata columnnumber="4">
<text>more text here</text></entrydata>
<entrydata columnnumber="5">
<text>more text here</text></entrydata>
<entrydata columnnumber="6">
<text>more text here</text></entrydata>
<entrydata columnnumber="7">
<text>more text here</text></entrydata>
<entrydata columnnumber="8">
<text>more text here</text></entrydata>
<entrydata columnnumber="9">
<text></text></entrydata>
</het>
<het position="1.1.2">
<entrydata columnnumber="2">
<text>text here</text></entrydata>
<entrydata columnnumber="3">
<text>more text here</text></entrydata>
<entrydata columnnumber="4">
<text>more text here</text></entrydata>
<entrydata columnnumber="5">
<text>more text here</text></entrydata>
<entrydata columnnumber="6">
<text>more text here</text></entrydata>
<entrydata columnnumber="7">
<text>more text here</text></entrydata>
<entrydata columnnumber="8">
<text>more text here</text></entrydata>
<entrydata columnnumber="9">
<text></text></entrydata>
</het>
<het position="2">
<entrydata columnnumber="0">
<text>some more text here</text></entrydata>
</het>
<het position="2.1">
<entrydata columnnumber="1">
<text>some more text here</text></entrydata>
</het>
<het position="2.1.1">
<entrydata columnnumber="2">
<text>text here</text></entrydata>
<entrydata columnnumber="3">
<text>more text here</text></entrydata>
<entrydata columnnumber="4">
<text>more text here</text></entrydata>
<entrydata columnnumber="5">
<text>more text here</text></entrydata>
<entrydata columnnumber="6">
<text>more text here</text></entrydata>
<entrydata columnnumber="7">
<text>more text here</text></entrydata>
<entrydata columnnumber="8">
<text>more text here</text></entrydata>
<entrydata columnnumber="9">
<text></text></entrydata>
</het>
</t>

and i was trying to recode it to nest:


<t>
        <het position="1">
                <entrydata columnnumber="0">
                <text>some more text here</text></entrydata>
                <het position="1.1">
                        <entrydata columnnumber="1">
                        <text>some more text here</text></entrydata>
                        <het position="1.1.1">
                                <entrydata columnnumber="2">
                                <text>text here</text></entrydata>
                                <entrydata columnnumber="3">
                                <text>more text here</text></entrydata>
                                <entrydata columnnumber="4">
                                <text>more text here</text></entrydata>
                                <entrydata columnnumber="5">
                                <text>more text here</text></entrydata>
                                <entrydata columnnumber="6">
                                <text>more text here</text></entrydata>
                                <entrydata columnnumber="7">
                                <text>more text here</text></entrydata>
                                <entrydata columnnumber="8">
                                <text>more text here</text></entrydata>
                                <entrydata columnnumber="9">
                                <text></text></entrydata>
                        </het>
                        <het position="1.1.2">
                                <entrydata columnnumber="2">
                                <text>text here</text></entrydata>
                                <entrydata columnnumber="3">
                                <text>more text here</text></entrydata>
                                <entrydata columnnumber="4">
                                <text>more text here</text></entrydata>
                                <entrydata columnnumber="5">
                                <text>more text here</text></entrydata>
                                <entrydata columnnumber="6">
                                <text>more text here</text></entrydata>
                                <entrydata columnnumber="7">
                                <text>more text here</text></entrydata>
                                <entrydata columnnumber="8">
                                <text>more text here</text></entrydata>
                                <entrydata columnnumber="9">
                                <text></text></entrydata>
                        </het>
                </het>
        </het>
        <het position="2">
                <entrydata columnnumber="0">
                <text>some more text here</text></entrydata>
                <het position="2.1">
                        <entrydata columnnumber="1">
                        <text>some more text here</text></entrydata>
                        <het position="2.1.1">
                                <entrydata columnnumber="2">
                                <text>text here</text></entrydata>
                                <entrydata columnnumber="3">
                                <text>more text here</text></entrydata>
                                <entrydata columnnumber="4">
                                <text>more text here</text></entrydata>
                                <entrydata columnnumber="5">
                                <text>more text here</text></entrydata>
                                <entrydata columnnumber="6">
                                <text>more text here</text></entrydata>
                                <entrydata columnnumber="7">
                                <text>more text here</text></entrydata>
                                <entrydata columnnumber="8">
                                <text>more text here</text></entrydata>
                                <entrydata columnnumber="9">
                                <text></text></entrydata>
                        </het>
                </het>
        </het>
</t>
but still hvaing a meard with it, any suggestions would be appreciated.

also, at the same time i thought that renaming different levelled hets would be a good idea- any het with 1-9 = res, 1.1-1.9 = rol, 1.1.1-1.1.9 = prod,
so it would look like
<t>
        <res>
                <rol>
                        <prod>
                        </prod>
                        <prod>
                        </prod>
                </rol>
                <rol>
                        <prod>
                        </prod>
                </rol>
        </res>
</t>
would i have to create new elements or is there a function to change element names??













From: Dimitre Novatchev <dnovatchev(_at_)yahoo(_dot_)com>
Reply-To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: Re: [xsl] restructuring element hierarchy using xslt Date: Mon, 29 Sep 2003 07:23:19 -0700 (PDT)

This transformation:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:variable name="Digits" select="1234567890"/>

 <xsl:template match="/*">
  <t>
   <xsl:apply-templates
    select="het[not(contains(@position, '.'))]"/>
   </t>
 </xsl:template>

  <xsl:template match="het">
    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <xsl:apply-templates
       select="../het[starts-with(@position, current()/@position)
                     and
                      string-length(translate(@position,
                                              $Digits,
                                              ''
                                              )
                                   )
                      =
                       1 + string-length(translate(current()/@position,
                                                   $Digits,
                                                  ''
                                                  )
                                         )
                     ]"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>


When applied to your source.xml:

<t>
  <het position="1"></het>
  <het position="1.1"></het>
  <het position="1.1.1"></het>
  <het position="1.1.2"></het>
  <het position="1.2"></het>
  <het position="1.2.1"></het>
  <het position="2"></het>
  <het position="2.1"></het>
  <het position="2.1.1"></het>
</t>

produces the wanted result:


<t>
   <het position="1">
      <het position="1.1">
         <het position="1.1.1"/>
         <het position="1.1.2"/>
      </het>
      <het position="1.2">
         <het position="1.2.1"/>
      </het>
   </het>
   <het position="2">
      <het position="2.1">
         <het position="2.1.1"/>
      </het>
   </het>
</t>


=====
Cheers,

Dimitre Novatchev.
http://fxsl.sourceforge.net/ -- the home of FXSL



> I have an xml document like this:
>
> <het position="1"></het>
> <het position="1.1"></het>
> <het position="1.1.1"></het>
> <het position="1.1.2"></het>
> <het position="1.2"></het>
> <het position="1.2.1"></het>
> <het position="2"></het>
> <het position="2.1"></het>
> <het position="2.1.1"></het>
>
> and i was trying to get it to look like this:
>
> <het position="1">
>  <het position="1.1">
>   <het position="1.1.1">
>   </het>
>   <het position="1.1.2">
>   </het>
>  </het>
>  <het position="1.2">
>   <het position="1.2.1">
>   </het>
>  </het>
> </het>
> <het position="2">
>  <het position="2.1">
>   <het position="2.1.1">
>   </het>
>  </het>
> </het>
>
> In other words make it nested. I can get the first set of  elements out
> by doing a contains() function in a predicate (<xsl:template
> match="het[contains(@position, '.')=false]">) but i am having a problem
> with template matching, i know i can't put a template match within a
> template match and this is causing me a bit of trouble.



__________________________________
Do you Yahoo!?
The New Yahoo! Shopping - with improved product search
http://shopping.yahoo.com

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


_________________________________________________________________
Get Hotmail on your mobile phone http://www.msn.co.uk/msnmobile


XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list