[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Re: xslt sort dilemna

Subject: Re: xslt sort dilemna
From: "Mohit Anchlia" <mohitanchlia@xxxxxxxxx>
Date: Wed, 10 Sep 2008 11:29:59 -0700
Re:  xslt sort dilemna
Thanks for taking interest in my problem. Here are complete details:

1. xml file A:
<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>SUCCEEDED</State>
               <rxTimestamp>2008-08-25T16:54:55.838-07:00</rxTimestamp>
               <details>
                  <Error>
                     <Problem>Its pending</Problem>
                  </Error>
               </details>
            </Msg>
         </ret>
         <ret>
            <CustMsg>
               <cid>103850015_0_1219420995471</cid>
               <fid>42</fid>
               <filing>IS</filing>
               <State>PENDING</State>
               <rxTimestamp>2008-08-25T16:54:55.839-07:00</rxTimestamp>
               <details>
                  <Error>
                     <Problem>Its pending</Problem>
                  </Error>
               </details>
            </CustMsg>
         </ret>
</ns2:getMessages>
</body>

2. xml file B:
<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>

3. 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='statusMsg' 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|$file2//ret">
                <xsl:sort select="Msg/filingType"  order="ascending" data-type=
"text"/>
                <xsl:sort select="Msg/State"  order="ascending" data-type="numb
er"/>
              </xsl:apply-templates>

    </xsl:otherwise>
  </xsl:choose>
</xsl:template>
<xsl:template match="*">
 <xsl:element name="{name()}" namespace="{namespace-uri()}">
   <xsl:choose>
     <xsl:when test=".='PENDING'">
             <xsl:text>1</xsl:text>
     </xsl:when>
     <xsl:when test=".='SUCCEEDED'">
             <xsl:text>2</xsl:text>
     </xsl:when>
   <xsl:otherwise>
    <xsl:choose>
     <xsl:when test="*">
       <xsl:apply-templates/>
     </xsl:when>
     <xsl:otherwise>
        <xsl:value-of select="." />
     </xsl:otherwise>
    </xsl:choose>
   </xsl:otherwise>
  </xsl:choose>
 </xsl:element>
</xsl:template>
</xsl:stylesheet>

4. Output:
<?xml version="1.0" encoding="UTF-8"?>
<ret>
            <Msg>
               <cid>103850015_0_1219420995471</cid>
               <fid>41</fid>
               <filing>IS</filing>
               <State>2</State>
               <rxTimestamp>2008-08-25T16:54:55.838-07:00</rxTimestamp>
               <details>
                  <Error>
                     <Problem>Its pending</Problem>
                  </Error>
               </details>
            </Msg>
         </ret>
<ret>
            <CustMsg>
               <cid>103850015_0_1219420995471</cid>
               <fid>42</fid>
               <filing>IS</filing>
               <State>1</State>
               <rxTimestamp>2008-08-25T16:54:55.839-07:00</rxTimestamp>
               <details>
                  <Error>
                     <Problem>Its pending</Problem>
                  </Error>
               </details>
            </CustMsg>
         </ret>
<ret>
            <Msg>
               <cid>103850015_0_1219420995471</cid>
               <fid>41</fid>
               <filing>IS</filing>
               <State>1</State>
            </Msg>
         </ret>

5. Expected Output:
<ret>
            <CustMsg>
               <cid>103850015_0_1219420995471</cid>
               <fid>42</fid>
               <filing>IS</filing>
               <State>1</State>
               <rxTimestamp>2008-08-25T16:54:55.839-07:00</rxTimestamp>
               <details>
                  <Error>
                     <Problem>Its pending</Problem>
                  </Error>
               </details>
            </CustMsg>
         </ret>
<ret>
            <Msg>
               <cid>103850015_0_1219420995471</cid>
               <fid>41</fid>
               <filing>IS</filing>
               <State>1</State>
            </Msg>
         </ret>
<ret>
            <Msg>
               <cid>103850015_0_1219420995471</cid>
               <fid>41</fid>
               <filing>IS</filing>
               <State>2</State>
               <rxTimestamp>2008-08-25T16:54:55.838-07:00</rxTimestamp>
               <details>
                  <Error>
                     <Problem>Its pending</Problem>
                  </Error>
               </details>
            </Msg>
         </ret>
---
With above xsl I expected State with value 2 to come last. But, with
your explanation now I understand why it might not be working. Is
there any alternative method that I can use to sort in the same XSL
file. Please let me know if I omitted something.


On Wed, Sep 10, 2008 at 8:55 AM, Wendell Piez <wapiez@xxxxxxxxxxxxxxxx> wrote:
> Mohit,
>
> At 11:17 AM 9/10/2008, you wrote:
>>
>> Thanks. I was thinking that sort gets applied to output if it's put
>> inside xsl:apply-templates, but it looks like it just works on input.
>> Thanks for the explanation.
>
> You're welcome, but I should also warn you that this bit of confusion may be
> indicative of a deeper problem, namely a hazy understanding of the
> processing model.
>
> As has been repeated often on this list, XSLT doesn't "change" or even
> "operate" on anything. What it does is build XML. Most commonly, it builds
> its output XML by following a set of rules (the stylesheet) as applied to
> another XML, which is considered the "input". (In your case it is
> complicated by the fact that you have more than one input file, but the
> basic situation is the same.) The XSLT process doesn't change the input at
> all: when the operation is complete, any input is still there exactly as it
> was. If your process has run successfully, you also now have an output.
>
> A sort, or for that matter any XSLT instruction or specification, doesn't
> work on output or on input. It simply says something about how the output
> (the "result") is built.
>
> This matters here because as long as you persist in thinking you're sorting
> output or sorting input, as opposed to specifying the rules whereby your
> processor builds the result, you're unlikely to be able to set those rules
> up properly. XSLT has a "normal" way of operating: by default, it will build
> its output in an order corresponding to the order of the nodes in the input
> that it selects for examination ("processing"). What a sort does is override
> this behavior by telling the processor to put the results in a different
> order. So you are "sorting" the input, but what "gets sorted" is the output.
>
> This makes no sense at all until you understand how any XSLT transformation
> works, at which point it becomes obvious, as in "but how else could it be?",
> and much easier to manage. The result reflects an imposed ("sorted") order
> of the input data instead of its native "document order".
>
>> Is there a way I could do this in one xslt itself?
>
> Probably, but you haven't given us enough information to say. You haven't
> even given us enough information to determine if your problem is due to a
> bug in your XSLT engine, or in something you are doing or not doing.
>
> I suggest you try again to compose a complete problem. Show us a minimal
> small example of input, the code that you are currently using, the result it
> is generating, and a description of what you want instead. Also tell us what
> XSLT processor you are using in case the processor isn't doing the right
> thing (since we can't guess what it will do if it doesn't do what it's
> supposed to).
>
> Cheers,
> Wendell
>
>
> ======================================================================
> Wendell Piez                            mailto:wapiez@xxxxxxxxxxxxxxxx
> Mulberry Technologies, Inc.                http://www.mulberrytech.com
> 17 West Jefferson Street                    Direct Phone: 301/315-9635
> Suite 207                                          Phone: 301/315-9631
> Rockville, MD  20850                                 Fax: 301/315-8285
> ----------------------------------------------------------------------
>  Mulberry Technologies: A Consultancy Specializing in SGML and XML
> ======================================================================

Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.