xsl-list
[Top] [All Lists]

RE: can restructure xml??

2003-01-15 06:00:47
Hi,

Yes, but hard coding the structure like that is evil. I don't know what's the 
best practice on these kinds of grouping problems nowadays (i.e. how to use 
xsl:key etc.), but I would recommend something like this:

<xsl:key name="title" match="list/*[not(self::title)]" 
use="generate-id(preceding-sibling::title[1])" />

<xsl:template match="list">
  <xsl:copy>
    <xsl:apply-templates select="@*"/>
    <xsl:apply-templates select="title" mode="group"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="title" mode="group">
  <item>
    <xsl:attribute name="num">
      <!-- you could use position() here, too -->
      <xsl:number count="title"/>
    </xsl:attribute>
    <xsl:apply-templates select=".|key('title', generate-id())"/>
  </item>  
</xsl:template>

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

Cheers,

Jarno - Feindflug: Vollstreckung

-----Original Message-----
From: ext Laura [mailto:xsl_list(_at_)hotmail(_dot_)com]
Sent: 15 January, 2003 14:28
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: Re: [xsl] can restructure xml??


You could do simple things like
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
    <xsl:output omit-xml-declaration="yes" indent="yes" method="xml"/>
    <xsl:template match="/">
        <root>
            <list>
                   <xsl:for-each select="/root/list/title">
                    <item num = "{position()}">
                        <title>
                            <xsl:value-of select="."/>
                        </title>
                        <writer>
                            <xsl:value-of
select="following-sibling::writer"/>
                        </writer>
                        <type>
                            <xsl:value-of 
select="following-sibling::type"/>
                        </type>
                        <remark>
                            <xsl:value-of
select="following-sibling::remark"/>
                        </remark>
                    </item>
                </xsl:for-each>
            </list>
        </root>
    </xsl:template>
</xsl:stylesheet>
this gets first writer,type and remark elements after each 
title element and
puts them under the item element. The number attribute takes 
the value of
the position() function. so the number of <item> elements you 
would have
will be the number of  <title> element you have.
But as Jarno suggested, you could as well modify the code 
that generates the
XML to produce the right kind of structure
Hope this helps
Vasu
-- Original Message -----
From: "a847356549/mail.h7.dion.ne.jp" 
<motom(_at_)h7(_dot_)dion(_dot_)ne(_dot_)jp>
To: <XSL-List(_at_)lists(_dot_)mulberrytech(_dot_)com>
Sent: Wednesday, January 15, 2003 11:32 AM
Subject: [xsl] can restructure xml??


hello.
I just started putting my data into xml.
now I only have a xml like ---

<root>
  <list>
    <title>aaa</title>
    <writer>bbb</writer>
    <type>ccc</type>
    <remark>ddd</remark>
    <title>eee</title>
    <writer>fff</writer>
    <type>ggg</type>
    <remark>hhh</remark>
    ...
  </cd>
</list>

my ideal structure is like ---

<root>
  <list>
   <item num="1">
    <title>aaa</title>
    <writer>bbb</writer>
    <type>ccc</type>
    <remark>ddd</remark>
   </item>
   <item num="2">
    <title>eee</title>
    <writer>fff</writer>
    <type>ggg</type>
    <remark>hhh</remark>
   </item>
    ...
  </list>
</root>

is there a way to do this throgh xsl?  any advice and hint will
 be grateful.

ttkaya

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


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


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



<Prev in Thread] Current Thread [Next in Thread>