Re: [xsl] badly need xsl help(prob with accessing child nodes in the script)

Subject: Re: [xsl] badly need xsl help(prob with accessing child nodes in the script)
From: "Benjamin Farrow" <lovinjess@xxxxxxxxxxx>
Date: Tue, 14 Oct 2003 16:55:37 -0700
Murali,
   Post your XML and XSL again...it worked fine with the XML you provided
previously using MSXML in XMLSpy.  I even ensured it worked with each of
your different formatting options (and changing the seperator).  Ensure that
you have the namespaces declared the same in the XML as in the XSL (prefix's
don't have to match between the two).  If it helps at first, remove all your
namespaces until you get all the XPath's working correctly, then add the
namespaces back in.  There are a lot of articles on steps to debug an XSL
file, you'll just have to break each of the parts down and ensure the data
is getting to each step correctly (output comments, or output a dummy
element, etc.).

Benjamin

----- Original Message -----
From: "Murali Korrapati" <murali.korrapati@xxxxxxxxx>
To: <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
Sent: Tuesday, October 14, 2003 12:35 PM
Subject: RE: [xsl] badly need xsl help(prob with accessing child nodes in
the script)


> Benjamin,
>  I tried your code. But it not working as expected. It is producing ouput
like this
>
>  <_Item>5302003</_Item>
>  <_Item>7302003</_Item>
>
> I tried different things on this. But still couldn't get the required
result. So posting it again.
> What I found on this is:
>   $Date variable is not getting anything and it is always going into
otherwise case and not able to show the s:Separator
>
> am I missing anything?
>
> thanks,
>
> ~Mur
>
> -----Original Message-----
> From: Benjamin Farrow [mailto:lovinjess@xxxxxxxxxxx]
> Sent: Tuesday, October 14, 2003 11:38 AM
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: RE: [xsl] badly need xsl help(prob with accessing child nodes
> in the script)
>
>
> Murali,
>     Here is a full copy of the XSL that seems to account for your
different
> date formats...all done in XSLT 1.0.  As far as using Javascript and
XSL...I
> would say don't confuse the two.  Either use XSL or use javascript, but
the
> use of inserting script like that in XSL is usual not helpful.  Do you
> javascript processing outside of the XSL and pass those modified values
into
> the XSL to create your output XML.
>
>    You see questions about benchmarking here a lot, and the general
response
> is...try it out.  Benchmarking is related to so many things, processor
> speed, memory, operating system, version of software etc.  The only way to
> see which way is quicker is to try the two out.  For me, pure XSL works
> rather well, but I do some processing outside the scope of XSL.
>    I think you are right that it is a question you have to ask yourself,
but
> looking at your javascript code, it is not necessary.  I understand you
> don't feel comfortable with XSL yet to replace your javascript knowledge
> with that, but don't try mixing the two and you might come up with some
more
> maintainable code.  Good luck,
>
> <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
> xmlns:ri="urn:schemas.abcd-com:RepInven"
> xmlns:s="urn:schemas.abcd-com:Static"
> xmlns:l="urn:schemas.abcd-com:layers">
>   <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
>
>   <xsl:variable name="Date" select="l:data/s:RegionalOptions/s:Date"/>
>
>   <xsl:template match="/">
>     <_Ctrl xmlns="">
>       <xsl:apply-templates
> select="l:data/ri:Rpt_Inven/ri:Inven/ri:EffectiveDate"/>
>     </_Ctrl>
>   </xsl:template>
>
>   <xsl:template match="ri:Rpt_Inven/ri:Inven/ri:EffectiveDate">
>     <_Item>
>       <xsl:call-template name="convertDate">
>         <xsl:with-param name="date" select="."/>
>       </xsl:call-template>
>     </_Item>
>   </xsl:template>
>
>   <xsl:template name="convertDate">
>     <xsl:param name="date"/>
>     <xsl:variable name="year" select="substring($date,1,4)"/>
>     <xsl:variable name="month" select="substring($date,6,2)"/>
>     <xsl:variable name="day" select="substring($date,9,2)"/>
>     <xsl:choose>
>       <xsl:when test="$date = ''"/>
>       <xsl:when test="$Date/s:ShortFormat = '1'">
>         <xsl:value-of select="number($month)"/>
>         <xsl:value-of select="$Date/s:Separator"/>
>         <xsl:value-of select="number($day)"/>
>         <xsl:value-of select="$Date/s:Separator"/>
>         <xsl:value-of select="$year"/>
>       </xsl:when>
>       <xsl:when test="$Date/s:ShortFormat = '2'">
>         <xsl:value-of select="number($day)"/>
>         <xsl:value-of select="$Date/s:Separator"/>
>         <xsl:value-of select="number($month)"/>
>         <xsl:value-of select="$Date/s:Separator"/>
>         <xsl:value-of select="$year"/>
>       </xsl:when>
>       <xsl:when test="$Date/s:ShortFormat = '3'">
>         <xsl:value-of select="$month"/>
>         <xsl:value-of select="$Date/s:Separator"/>
>         <xsl:value-of select="$day"/>
>         <xsl:value-of select="$Date/s:Separator"/>
>         <xsl:value-of select="$year"/>
>       </xsl:when>
>       <xsl:when test="$Date/s:ShortFormat = '4'">
>         <xsl:value-of select="$day"/>
>         <xsl:value-of select="$Date/s:Separator"/>
>         <xsl:value-of select="$month"/>
>         <xsl:value-of select="$Date/s:Separator"/>
>         <xsl:value-of select="$year"/>
>       </xsl:when>
>       <xsl:when test="$Date/s:ShortFormat = '5'">
>         <xsl:value-of select="$year"/>
>         <xsl:value-of select="$Date/s:Separator"/>
>         <xsl:value-of select="$month"/>
>         <xsl:value-of select="$Date/s:Separator"/>
>         <xsl:value-of select="$day"/>
>       </xsl:when>
>       <xsl:otherwise>
>         <xsl:value-of select="number($month)"/>
>         <xsl:value-of select="$Date/s:Separator"/>
>         <xsl:value-of select="number($day)"/>
>         <xsl:value-of select="$Date/s:Separator"/>
>         <xsl:value-of select="$year"/>
>       </xsl:otherwise>
>     </xsl:choose>
>   </xsl:template>
>
>   <xsl:template match="node()|@*">
>     <xsl:apply-templates select="node()|@*"/>
>   </xsl:template>
>
> </xsl:stylesheet>
>
>
> Benjamin
>
> >From: "Murali Korrapati" <murali.korrapati@xxxxxxxxx>
> >Reply-To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> >To: <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
> >Subject: RE: [xsl] badly need xsl help(prob with accessing child nodes in
> >the script)
> >Date: Tue, 14 Oct 2003 10:13:59 -0400
> >
> >Hi Benjamin,
> >   Thanks for your reply. It looks like this solution works for me.
> >But I already have all that code in javascript. I use it in other places.
> >I have more data types like Date, Currency and Time. I am trying to
re-use
> >it here.
> >And I found a stupid work around for my original problem. Like
> >
> >   loading the xml from RegOpts[0] in the init() function into a new DOM
> >and accessing that from there.
> >
> >I know it is lame but working.
> >
> >Now I can re-write all that in xsl but question is
> >
> >1) Which is faster in transformation, xsl or JavaScript?
> >2) Is it really good maintaining two copies(xsl and javascript) of same
> >code?
> >(I know this second question is not really for the forum. It is for
myself)
> >
> >~Mur
> >
> >-----Original Message-----
> >From: Benjamin Farrow [mailto:lovinjess@xxxxxxxxxxx]
> >Sent: Monday, October 13, 2003 8:19 PM
> >To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> >Subject: RE: [xsl] badly need xsl help(prob with accessing child nodes
> >in the script)
> >
> >
> >Murali,
> >     It's past my time to head home, but it appears that your javascript
is
> >not really needed.  All of what you do there could be done in XSL.  If my
> >quick glance was correct, you have different date formats defined by the
> >element Date/ShortFormat.  I didn't have a chance to look close enough to
> >how each of these formats are defined in your switch statement in your
> >javascript , but perhaps this gives an idea of how to go about it...
> >
> ><xsl:stylesheet version="1.0"
> >xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
> >xmlns:ri="urn:schemas.abcd-com:RepInven"
> >xmlns:s="urn:schemas.abcd-com:Static"
> >xmlns:l="urn:schemas.abcd-com:layers">
> >   <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
> >
> >   <xsl:variable name="Date" select="l:data/s:RegionalOptions/s:Date"/>
> >
> >   <xsl:template match="/">
> >     <_Ctrl xmlns="">
> >       <xsl:apply-templates
> >select="l:data/ri:Rpt_Inven/ri:Inven/ri:EffectiveDate"/>
> >     </_Ctrl>
> >   </xsl:template>
> >
> >   <xsl:template match="ri:Rpt_Inven/ri:Inven/ri:EffectiveDate">
> >     <_Item>
> >       <xsl:call-template name="convertDate">
> >         <xsl:with-param name="date" select="."/>
> >       </xsl:call-template>
> >     </_Item>
> >   </xsl:template>
> >
> >   <xsl:template name="convertDate">
> >     <xsl:param name="date"/>
> >     <xsl:variable name="year" select="substring($date,1,4)"/>
> >     <xsl:variable name="month" select="substring($date,6,2)"/>
> >     <xsl:variable name="day" select="substring($date,9,2)"/>
> >     <!-- put a choose/when for each of your different formats and use
the
> >variables as needed... -->
> >     <xsl:value-of select="$month"/>
> >     <xsl:value-of select="$Date/s:Separator"/>
> >     <xsl:value-of select="$day"/>
> >     <xsl:value-of select="$Date/s:Separator"/>
> >     <xsl:value-of select="$year"/>
> >   </xsl:template>
> >
> >   <xsl:template match="node()|@*">
> >     <xsl:apply-templates select="node()|@*"/>
> >   </xsl:template>
> >
> ></xsl:stylesheet>
> >
> >again, I just whipped this together and realized, it's time to head home
> >for
> >me...so if you don't get an answer by tomorrow morning I'll try to
> >understand your javascript better then...
> >
> >Benjamin
> >
> >
> > >From: "Murali Korrapati" <murali.korrapati@xxxxxxxxx>
> > >Reply-To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> > >To: <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
> > >Subject: RE: [xsl] badly need xsl help(prob with accessing child nodes
in
> > >the script)
> > >Date: Mon, 13 Oct 2003 15:27:08 -0400
> > >
> > >Hi guys,
> > >   Lets try to forget everything that started b'cos of me. We are here
to
> > >help each other, not to fight.
> > >Try to be as friendly as possible and help each other.
> > >
> > >I tried the namespace(you can see that in my modified code in init()
> > >function) as Michael Kay said. But I have no luck.
> > >This is what I am exactly doing and want to do. Can anybody give any
> > >suggestions?
> > >
> > >Thanks.
> > >
> > >xml:
> > >
> > ><data xmlns="urn:schemas.abcd-com:layers">
> > > <Rpt_Inven xmlns="urn:schemas.abcd-com:RepInven" >
> > > <Inven>
> > > <EffectiveDate>2003-05-30</EffectiveDate>
> > > </Inven>
> > > <Inven>
> > > <EffectiveDate>2003-07-30</EffectiveDate>
> > > </Inven>
> > > </Rpt_Inven>
> > > <RegionalOptions xmlns="urn:schemas.abcd-com:Static">
> > > <Date>
> > > <Calendar>
> > > <TwoDigitYear>79</TwoDigitYear>
> > > </Calendar>
> > > <Separator>/</Separator>
> > > <ShortFormat>3</ShortFormat>
> > > </Date>
> > > <Currency>
> > > <DecimalSymbol>.</DecimalSymbol>
> > > <GroupingSymbol>,</GroupingSymbol>
> > > <DigitGrouping>2</DigitGrouping>
> > > </Currency>
> > > <Locale>1033</Locale>
> > > </RegionalOptions>
> > ></data>
> > >
> > >
> > >xsl :
> > >
> > ><xsl:stylesheet version="1.0" xmlns=""
> > >xmlns:lay="urn:schemas.abcd-com:layers"
> > >xmlns:rep="urn:schemas.abcd-com:RepInven"
> > >xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
> > >xmlns:msxsl="urn:schemas-microsoft-com:xslt"
> > >xmlns:scrdt="urn:schemas.abcd-com:datatypes"
> > >xmlns:stat="urn:schemas.abcd-com:Static">
> > > <xsl:output method="xml" encoding="UTF-8"/>
> > > <xsl:template match="lay:data">
> > > <_Ctrl>
> > > <xsl:call-template name="callInit">
> > > <xsl:with-param name="regOptNode" select="stat:RegionalOptions"/>
> > > </xsl:call-template>
> > > <xsl:for-each select="rep:Rpt_Inven/rep:Inven/rep:EffectiveDate">
> > > <_Item>
> > > <xsl:call-template name="genItem">
> > > <xsl:with-param name="attrNode" select="."/>
> > > </xsl:call-template>
> > > </_Item>
> > >   </xsl:for-each>
> > > </_Ctrl>
> > > </xsl:template>
> > > <xsl:template name="callInit">
> > > <xsl:param name="regOptNode"/>
> > > <xsl:value-of select="scrdt:init($regOptNode)"/>
> > > <xsl:value-of select="scrdt:getValue($attrNode)"/>
> > > </xsl:template>
> > > <xsl:template name="genItem">
> > > <xsl:param name="attrNode"/>
> > > <xsl:value-of select="scrdt:getValue($attrNode)"/>
> > > </xsl:template>
> > ><msxsl:script language="JScript" implements-prefix="scrdt"><![CDATA[
> > >var _xDate_ShortFormat;
> > >var _xDate_Separator;
> > >
> > >function init(RegOpts)
> > >{
> > > if( !RegOpts.length) return "length 0";
> > > var dateNode = RegOpts[0].selectSingleNode("stat:Date");
> > > if(dateNode != null )
> > > {
> > > _xDate_ShortFormat = dateNode.selectSingleNode("ShortFormat");
> > > _xDate_Separator = dateNode.selectSingleNode("Separator");
> > > }
> > > else
> > > {
> > > //It seems it is always going here.
> > > _xDate_ShortFormat = 5;
> > > _xDate_Separator = "-";
> > > }
> > >
> > > return "";
> > >}
> > >function getValue(nodes)
> > >{
> > >try
> > >{
> > > var node  = nodes[0];
> > > var val, def;
> > > switch (node.nodeType)
> > > {
> > > case 1:
> > > val = node.text;
> > > def = node;
> > > break;
> > > case 2:
> > > val = node.nodeValue;
> > > def = null;
> > > break;
> > > case 3:
> > > val = node.nodeValue;
> > > def = node.parentNode;
> > > break;
> > > }
> > >
> > > if (def!=null)
> > > {
> > > val = xVal.formatValue(val);
> > > }
> > >
> > > return val;
> > >}
> > >catch(e)
> > >{
> > > return e.description;
> > >}
> > >}
> > >function formatValue()
> > >{
> > >
> > > var dt;
> > > var fmt = new RegExp("^([0-9]{4})-([0-9]{2})-([0-9]{2})$","");
> > > var res = dStr.match(fmt);
> > > if (res!=null)
> > > {
> > > var y = parseInt(res[1],10);
> > > var m = parseInt(res[2],10);
> > > var d = parseInt(res[3],10);
> > > dt = new Date(y,m-1,d);
> > > if (dt.getFullYear()!=y || dt.getMonth()!=(m-1) || dt.getDate()!=d)
> > > return "";
> > > }
> > > else
> > > return "";
> > >
> > > if (dt!=null)
> > > {
> > > var y = dt.getFullYear();
> > > var m = dt.getMonth() + 1;
> > > var d = dt.getDate();
> > > switch(_xDate_ShortFormat)
> > > {
> > > case 1:
> > > return m.toString() + _xDate_Separator +
> > > d.toString() + _xDate_Separator +
> > > y.toString();
> > > case 3:
> > > return (m<10?"0":"") + m.toString() + _xDate_Separator +
> > > (d<10?"0":"") + d.toString() + _xDate_Separator +
> > > y.toString();
> > > case 2:
> > > return d.toString() + _xDate_Separator +
> > > m.toString() + _xDate_Separator +
> > > y.toString();
> > > case 4:
> > > return (d<10?"0":"") + d.toString() + _xDate_Separator +
> > > (m<10?"0":"") + m.toString() + _xDate_Separator +
> > > y.toString();
> > > case 5:
> > > return y.toString() + _xDate_Separator +
> > > (m<10?"0":"") + m.toString() + _xDate_Separator +
> > > (d<10?"0":"") + d.toString();
> > > default:
> > > return m.toString() + _xDate_Separator +
> > > d.toString() + _xDate_Separator +
> > > y.toString();
> > > }
> > > }
> > > else
> > > return "";
> > >}
> > > ]]></msxsl:script>
> > >
> > ></xsl:stylesheet>
> > >
> > >     With this xml and xsl, I am expecting my out some thing like
> > >
> > ><_Ctrl xmlns="" xmlns:lay="urn:schemas.abcd-com:layers"
> > >xmlns:rep="urn:schemas.abcd-com:RepInven"
> > >xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
> > >xmlns:msxsl="urn:schemas-microsoft-com:xslt"
> > >xmlns:scrdt="urn:schemas.abcd-com:datatypes"
> > >xmlns:stat="urn:schemas.abcd-com:Static">
> > > <_Item>
> > > 05/30/2003
> > > </_Item>
> > > <_Item>
> > > 07/30/2003
> > > </_Item>
> > ></_Ctrl>
> > >
> > >    But it is always producing something like
> > >
> > >    <_Ctrl xmlns="" xmlns:lay="urn:schemas.abcd-com:layers"
> > >xmlns:rep="urn:schemas.abcd-com:RepInven"
> > >xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
> > >xmlns:msxsl="urn:schemas-microsoft-com:xslt"
> > >xmlns:scrdt="urn:schemas.abcd-com:datatypes"
> > >xmlns:stat="urn:schemas.abcd-com:Static">
> > > <_Item>
> > > 2003-05-30
> > > </_Item>
> > > <_Item>
> > > 2003-07-30
> > > </_Item>
> > ></_Ctrl>
> > >
> > >
> > >       I think this b'cos I am not able to get access to the <Date/>
node
> > >in the script function. And whenever I say RegOpts(i).firstChild , I am
> > >getting the result I want.
> > >
> > >Any ideas about. I am very desperate for this.
> > >
> > >thanks,
> > >
> > >~Mur
> > >
> > >
> > >  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
> > >
> >
> >_________________________________________________________________
> >Surf and talk on the phone at the same time with broadband Internet
access.
> >Get high-speed for as low as $29.95/month (depending on the local service
> >providers in your area).  https://broadband.msn.com
> >
> >
> >  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
> >
> >
> >  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
> >
>
> _________________________________________________________________
> Page a contact's mobile phone with  MSN Messenger 6.0. Download it now
FREE!
>    http://msnmessenger-download.com
>
>
>  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


Current Thread