You are viewing a plain text version of this content. The canonical link for it is here.
Posted to j-users@xalan.apache.org by Stephane Dion <st...@accovia.com> on 2005/10/20 20:51:26 UTC

RE : xalan xsl:sort does not sort!

 

It works!  Thanks a lot Henry.

 

Like you mention, I would like to have the same input XML as my output XML
(with the netPrice sorted) but the attributes are not copied even if I have
the xsl:copy.  Can you help me on this?  

 

I tried to add my namespace but it’s not working anymore with it.  I read
many web pages and tried many things.  Here is my new stylesheet with my
namespace, what’s wrong:

 

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 

 xmlns:aco="http://www.org/TRIP2004A/01"

version="1.0">

  <xsl:output method="xml"/>

 

  <xsl:template
match="aco:/GetProductOptionsResponse/DetailedProduct/ProductOptionGroup/Pro
ductOption">

    <xsl:copy>

       <xsl:apply-templates>

         <xsl:sort data-type="number" select="@netAmount"
order="ascending"/>

       </xsl:apply-templates>

    </xsl:copy>

  </xsl:template>

 

  <xsl:template match="*">

    <xsl:copy>

      <xsl:apply-templates/>

    </xsl:copy>

  </xsl:template>

</xsl:stylesheet>

 

 

Thanks a lot again!

Stephane

 

 

-----Message d'origine-----
De : Henry Zongaro [mailto:zongaro@ca.ibm.com] 
Envoyé : October 20, 2005 13:37
À : stephane@accovia.com
Cc : xalan-j-users@xml.apache.org
Objet : Re: xalan xsl:sort does not sort!

 

Hi, Stephane.

 

"Stephane Dion" <st...@accovia.com> wrote on 2005-10-20 09:51:08 AM:

> I?m trying to sort each block of NetPrice element by the attribute 

> NetAmount.  In each ProductOption, I have multiple NetPrice element

> 

> Check my example below. 

 

Focusing on the first template in your sample:

 

>   <xsl:template 

> 

match="/GetProductOptionsResponse/DetailedProduct/ProductOptionGroup/Product
Option">

>     <xsl:copy>

>        <xsl:apply-templates>

>          <xsl:sort data-type="number"

>                    select="NetPrice/@netAmount" 

>                    order="ascending"/>

>        </xsl:apply-templates>

>     </xsl:copy>

>   </xsl:template>

 

Each node selected for the xsl:apply-templates instruction, is used as the 

context node to evaluate the select expression in the xsl:sort.  With your 

input document, the xsl:apply-templates selects the NetPrice children of 

ProductOption.  Each NetPrice node becomes the context node for evaluating 

the expression NetPrice/@netAmount in the xsl:sort, which results in an 

empty node set, because no NetPrice element has a NetPrice element as a 

child.

 

If you change the xsl:sort to the following, it should work:

 

 

         <xsl:sort data-type="number"

                   select="@netAmount" 

                   order="ascending"/>

 

I hope that helps.

 

As an aside, I noticed that the elements in your input document have a 

non-null namespace, but you didn't use that in the match pattern for the 

first template.  I also noticed that you're not copying any attributes. 

I'm guessing that both of those problems arose when you produced your 

example stylesheet, and the original stylesheet handles those things 

correctly, but I thought I'd point them out anyway just in case.

 

Thanks,

 

Henry

------------------------------------------------------------------

Henry Zongaro      Xalan development

IBM SWS Toronto Lab   T/L 969-6044;  Phone +1 905 413-6044

mailto:zongaro@ca.ibm.com

 

 


Re: RE : xalan xsl:sort does not sort!

Posted by Henry Zongaro <zo...@ca.ibm.com>.
David Bertoni <db...@apache.org> wrote on 2005-10-21 01:59:50 PM:
> Henry Zongaro wrote:
> > The default value for the select attribute of the xsl:apply-templates 
> > instruction is "*", which means that templates matching the element 
> > children of the current node will be applied.
> 
> Not quite true.  If the xsl:apply-templates instruction does not have a 
> select attribute, then default behavior is to select all of the children 

> of the current node.

Whoops!  Thanks, Dave, for catching my mistake.

My apologies for any confusion I may have caused.

Thanks,

Henry
------------------------------------------------------------------
Henry Zongaro      Xalan development
IBM SWS Toronto Lab   T/L 969-6044;  Phone +1 905 413-6044
mailto:zongaro@ca.ibm.com

Re: RE : xalan xsl:sort does not sort!

Posted by David Bertoni <db...@apache.org>.
Henry Zongaro wrote:
> Hi, Stephane.
> 
> "Stephane Dion" <st...@accovia.com> wrote on 2005-10-20 02:51:26 PM:
> 
>>Like you mention, I would like to have the same input XML as my 
>>output XML (with the netPrice sorted) but the attributes are not 
>>copied even if I have the xsl:copy.  Can you help me on this?  
> 
> 
> The default value for the select attribute of the xsl:apply-templates 
> instruction is "*", which means that templates matching the element 
> children of the current node will be applied.

Not quite true.  If the xsl:apply-templates instruction does not have a 
select attribute, then default behavior is to select all of the children 
of the current node.

http://www.w3.org/TR/xslt#section-Applying-Template-Rules

"In the absence of a select attribute, the xsl:apply-templates 
instruction processes all of the children of the current node, including 
text nodes."

So the real default is "node()".

> 
> See [1] for tutorial information about XSLT.  You can find information 
> about the Mulberry XSL Mailing List at [2], which is a good place to ask 
> questions about XSLT.  The xalan-j-users mailing list is really intended 
> as a place to discuss issues that are specific to the Xalan-J processors.
>

I agree with Henry.  You will not find a better resource for XSLT 
questions than the Mulberry list.

Dave

RE : xalan xsl:sort does not sort!

Posted by Henry Zongaro <zo...@ca.ibm.com>.
Hi, Stephane.

"Stephane Dion" <st...@accovia.com> wrote on 2005-10-20 02:51:26 PM:
> Like you mention, I would like to have the same input XML as my 
> output XML (with the netPrice sorted) but the attributes are not 
> copied even if I have the xsl:copy.  Can you help me on this?  

The default value for the select attribute of the xsl:apply-templates 
instruction is "*", which means that templates matching the element 
children of the current node will be applied.  So your stylesheet copies a 
node and then invokes apply templates for the child elements of that node, 
never doing the same for the attributes.  The path expression for 
selecting all attributes of the context node is "@*".  Your stylesheet 
will similarly need a template that matches any attribute node and copies 
it to the output document.
 
> I tried to add my namespace but it?s not working anymore with it.

The namespace prefix needs to be specified for each name to which it 
applies.

Here's a modified stylesheet that should do what you expect:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
 xmlns:aco="http://www.org/TRIP2004A/01"
version="1.0">
  <xsl:output method="xml"/>
 
  <xsl:template 
match="/aco:GetProductOptionsResponse/aco:DetailedProduct/aco:ProductOptionGroup/aco:ProductOption">
    <xsl:copy>
       <xsl:apply-templates select="@*"/>
       <xsl:apply-templates>
         <xsl:sort data-type="number" select="@netAmount" 
order="ascending"/>
       </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>
 
  <xsl:template match="*|@*">
    <xsl:copy>
      <xsl:apply-templates select="*|@*"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

See [1] for tutorial information about XSLT.  You can find information 
about the Mulberry XSL Mailing List at [2], which is a good place to ask 
questions about XSLT.  The xalan-j-users mailing list is really intended 
as a place to discuss issues that are specific to the Xalan-J processors.

I hope that helps.

Thanks,

Henry
[1] http://xml.apache.org/xalan-j/overview.html#uptospeed
[2] http://xml.apache.org/xalan-j/faq.html#faq-N10025
------------------------------------------------------------------
Henry Zongaro      Xalan development
IBM SWS Toronto Lab   T/L 969-6044;  Phone +1 905 413-6044
mailto:zongaro@ca.ibm.com