RE: [xsl] xsl: parsing through specific child nodes

Subject: RE: [xsl] xsl: parsing through specific child nodes
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Mon, 8 Sep 2008 18:03:55 +0100
In your match="/" template, the only apply-templates is to an element called
"ret". There is no element named ret in your source document. Therefore the
template rule with match="*" will never fire, therefore the code that
replaces "PENDING" by "1" will not be executed.

Michael Kay
http://www.saxonica.com/ 

> -----Original Message-----
> From: Mohit Anchlia [mailto:mohitanchlia@xxxxxxxxx] 
> Sent: 08 September 2008 17:48
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Re: [xsl] xsl: parsing through specific child nodes
> 
> So I tried various things but it doesn't seem to be working. 
> I'll give the complete information:
> 
> 1. xml file:
> <?xml version="1.0" encoding="UTF-8"?>
> <Msg xmlns:ns2="http://www.abc.com/wsdl/v";>
> <Msg>
>                <cid>103850015_0_1219420995471</cid>
>                <fid>41</fid>
>                <filing>IS</filing>
>                <State>PENDING</State>
>             </Msg>
> </Msg>
> 
> 2. xsl file:
> 
> <?xml version="1.0"?>
> <xsl:stylesheet 
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; version="1.0"
> exclude-result-prefixes="xmlns:ns2 ns2 xmlns"> <xsl:output 
> method="xml" indent="yes" /> <xsl:variable name="file2" 
> select="document('EFF')" /> <xsl:key name='PENDING' 
> match='Msg' use='./State'/> <xsl:template match="/">
>    <xsl:choose>
>     <xsl:when test="not(//State='PENDING')
>                 and not(//State='SUCCEDED')">
>        <ret>
>           <xsl:copy-of select="//ret/*" />
>        </ret>
>     </xsl:when>
>     <xsl:when test="not($file2//State='PENDING')
>                 and not($file2//State='SUCCEDED')">
>        <ret>
>           <xsl:copy-of select="$file2//ret/*" />
>        </ret>
>     </xsl:when>
>     <xsl:otherwise>
>           <xsl:apply-templates select="//ret"/>
>     </xsl:otherwise>
>   </xsl:choose>
> </xsl:template>
> <xsl:template match="ret">
>        <xsl:apply-templates select="*"/> </xsl:template> 
> <xsl:template match="*">  <xsl:copy>
>    <xsl:choose>
>      <xsl:when test="text()='PENDING'">
>              <xsl:text>1</xsl:text>
>      </xsl:when>
>    <xsl:otherwise>
>      <xsl:copy-of select="." />
>    </xsl:otherwise>
>   </xsl:choose>
>  </xsl:copy>
> </xsl:template>
> </xsl:stylesheet>
> 
> 3. Output:
> <?xml version="1.0" encoding="UTF-8"?>
> <Msg xmlns:ns2="http://www.abc.com/wsdl/v";>
> <Msg>
>                <cid>103850015_0_1219420995471</cid>
>                <fid>41</fid>
>                <filing>IS</filing>
>                <State>PENDING</State>
>             </Msg>
> </Msg>
> 
> 4.expected output:
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <Msg>
>                <cid>103850015_0_1219420995471</cid>
>                <fid>41</fid>
>                <filing>IS</filing>
>                <State>1</State>
>             </Msg>
> </Msg>
> 
> 
> First I don't understand how there are 2 Msg nodes. And 
> second I wasn't able to get rid of namespace node by using 
> <element> as suggested by Michael, it's still copying the 
> namespace node.
> On Mon, Sep 8, 2008 at 6:52 AM, Mukul Gandhi 
> <gandhi.mukul@xxxxxxxxx> wrote:
> > On Mon, Sep 8, 2008 at 1:16 AM, Mohit Anchlia 
> <mohitanchlia@xxxxxxxxx> wrote:
> >> 1. So would above template mentioned by Mukul also output 
> node HIJ ?
> >
> > I think, "outputting the node" is not the correct 
> terminology. We can 
> > copy the node to the result tree, or write something else to the 
> > result tree, derived from the properties of the input nodes.
> >
> >>       <xsl:when test="local-name()="HIJ" and . = 'YYYYYY'">
> >
> > This statement will probably not compile, as I can see some 
> misplaced quotes.
> >
> >
> >> 3. Currently I am using XSLT 1.0 and I am using JAXP which 
> uses Xalan.
> >> How do I start using XSLT 2.0.
> >
> > You need to download an XSLT 2.0 processor, like Saxon and 
> using it as 
> > described in the documentation.
> >
> >> Would it just be matter of upping version in stylesheet node?
> >
> > No. version="2.0" is just a hint to the processor. You need 
> to supply 
> > the XSLT 2.0 stylesheet to a XSLT 2.0 processor like Saxon.
> >
> >
> > --
> > Regards,
> > Mukul Gandhi

Current Thread