Subject: Re: [xsl] xslt sort dilemna From: "Mohit Anchlia" <mohitanchlia@xxxxxxxxx> Date: Wed, 10 Sep 2008 11:30:48 -0700 |
Forgot to mention that I am using Xalan On Wed, Sep 10, 2008 at 11:29 AM, Mohit Anchlia <mohitanchlia@xxxxxxxxx> wrote: > 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 |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] xslt sort dilemna, Mohit Anchlia | Thread | RE: [xsl] xslt sort dilemna, Michael Kay |
Re: [xsl] xslt sort dilemna, Mohit Anchlia | Date | RE: [xsl] xslt sort dilemna, Michael Kay |
Month |