Subject: Re: [xsl] xsl: parsing through specific child nodes From: "Mohit Anchlia" <mohitanchlia@xxxxxxxxx> Date: Mon, 8 Sep 2008 10:44:44 -0700 |
Sorry I gave incorrect xml document: Here is the correct one: 1. xml document <body> <ns2:getMessages xmlns:ns2="http://www.abc.com/wsdl/v"> <ret> <Msg> <cid>103850015_0_1219420995471</cid> <fid>41</fid> <filing>IS</filing> <State>PENDING</State> </Msg> </ret> </ns2:getMessages> </body> 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> On Mon, Sep 8, 2008 at 10:03 AM, Michael Kay <mike@xxxxxxxxxxxx> wrote: > 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 |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] xsl: parsing through spec, Michael Kay | Thread | RE: [xsl] xsl: parsing through spec, Michael Kay |
RE: [xsl] xsl: parsing through spec, Michael Kay | Date | RE: [xsl] xsl: parsing through spec, Michael Kay |
Month |