xsl-list
[Top] [All Lists]

RE: Closing and opeing tag in that order

2002-12-27 06:00:12
Chandra,
Here is how I did it. I think that you could save yourself alot of
trouble by making the loose text attributes of tag1. (below)

I didn't put data3 loose in tag1, I thought this inconsistency must
be an oversight of somekind.

Sincerely,
Mike Ferrando
Washington, DC

===output:===
<?xml version="1.0" encoding="utf-8" standalone="no"?>

<tag1>data1</tag1>
<tag1>
   <tag2>data2</tag2>
</tag1>
<tag1>data3</tag1>
<tag1>
   <tag2>data4</tag2>
</tag1>
<tag1>
   <tag2>data5</tag2>
</tag1>


===XML:===
<?xml version="1.0" encoding="utf-8" standalone="no"?>

<tag1>
    data1
    <tag2>data2</tag2>
    data3
    <tag2>data4</tag2>
    <tag2>data5</tag2>
</tag1>


===XSL:===
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet   version="1.0"  
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
<xsl:output version="1.0" method="xml" indent="yes" encoding="utf-8"
omit-xml-declaration="no" standalone="no" media-type="text/xml"/>

<xsl:template match="/">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="tag1">
  <xsl:apply-templates mode="xxx"/>
</xsl:template>

<xsl:template match="tag2" mode="xxx">
  <tag1>
   <tag2>
    <xsl:apply-templates/>
   </tag2>
  </tag1>
</xsl:template>

<xsl:template match="text()" mode="xxx">
 <xsl:variable name="test" select="normalize-space(.)"/>
  <xsl:choose>
   <xsl:when test="string-length($test)&gt;1">
    <tag1>
     <xsl:value-of select="normalize-space(translate(., '&#xA;',
''))"/>
    </tag1>
   </xsl:when>
   <xsl:otherwise>
   </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template match="text()">
<xsl:value-of select="normalize-space(translate(., '&#xA;', ''))"/>
</xsl:template>

</xsl:stylesheet>

--- Chandra - <pchandramohan(_at_)hotmail(_dot_)com> wrote:
Hi Tom,
  Thanks for the quick reply. Well for the tag structure you
mentioned
------
If you had a document like this, what should
the output look like?

<tag1>
    data1
    <tag2>data2</tag2>
    data3
    <tag2>data4</tag2>
    <tag2>data5</tag2>
  </tag1>
-----
the output should be


<tag1>
    data1
</tag1><tag1>
    <tag2>data2</tag2>
    data3
</tag1><tag1>
    <tag2>data4</tag2>
</tag1><tag1>
    <tag2>data5</tag2>
  </tag1>

You see the dtd states that "a <tag1> element can have a  SINGLE
<tag2> 
element as child provided <tag1> is IMMEDIATELY followed by <tag2>.

  The document is a valid  and well formed finally even though i
add the 
tags in this manner </tag1><tag1>.
  Regrouping the elements is not feasible in my situation as
several other 
things would be affected. I was hence wondering whether there was
any 
solution. If I use <xml:output> tag to show as "text". would that
work??
Thanks in advance
Regards,
Chandra








----Original Message Follows----
From: "Passin, Tom" <tpassin(_at_)mitretek(_dot_)org>
Reply-To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
To: <xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com>
Subject: RE: [xsl] Closing and opeing tag in that order

[ Chandra]
 >  I need to tansform an xml document into another xml
 > document so that the
 > transformed xml document conforms to a certain dtd.
 >   In order to do that, I need to add a closing tag followed
 > by an opening
 > tag. For eg:
 >
 > The initial document:
 > <tag1>
 >   data1
 >   <tag2>data2</tag2>
 > </tag1>
 >
 >
 > The transformed document must be
 > <tag1>
 >   data1
 > </tag1><tag1>         <!--LINE 3-->
 >   <tag2>data2</tag2>
 > </tag1>
 >
 > So u see, I need the LINE3 to be added. The XSLT processor
 > gives me an error
 > when I try to do that.

Of course it gives you an error - you are trying to use
non-well-formed
xml in the stylesheet.  You do NOT need to add your LINE3. 
Instead, you
need to regroup your elements.  To do that, you need to understand
what
the rules for regrouping are.  You have not conveyed them clearly
yet,
but once you do, either you will see what to do or the we can help
you.

For example, is each instance of a tag2 element supposed to be the
only
child of a tag1 element?  If you had a document like this, what
should
the output look like?

<tag1>
    data1
    <tag2>data2</tag2>
    data3
    <tag2>data4</tag2>
    <tag2>data5</tag2>
  </tag1>

Or, if you cannot have a document like this, what combinations are
allowed in the source document?  Just get clear on what your
transformation really has to be, and until you do that stop
thinking
like "adding a line".  XSLT is about changing one tree to another -
not
about adding lines of text or markup - and that is how you need to
think
about your problem.

Cheers,

Tom P

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


_________________________________________________________________
The new MSN 8: smart spam protection and 3 months FREE*. 

http://join.msn.com/?page=features/junkmail&xAPID=42&PS=47575&PI=7324&DI=7474&SU=


http://www.hotmail.msn.com/cgi-bin/getmsg&HL=1216hotmailtaglines_smartspamprotection_3mf


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



__________________________________________________
Do you Yahoo!?
Yahoo! Mail Plus - Powerful. Affordable. Sign up now.
http://mailplus.yahoo.com

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



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