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

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