So a few things - first you are killing yourself in the way you XSLT is written. Personally, I'd do:

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

    <xsl:output method="xml" />

    <xsl:template match="/">
        <Root>
            <xsl:apply-templates select="a">
                <xsl:sort select="a"/>
            </xsl:apply-templates>
        </Root>
    </xsl:template>

    <xsl:template name="a">
        <result>
            <xsl:attribute name="value">
                <xsl:value-of select="."/>
            </xsl:attribute>
        </result>
    </xsl:template>
</xsl:stylesheet>

The sort above may be wrong as I didn't test it - but you get the idea.

You are trying to do the work of the templating engine in your XSLT :)

See if this works and holler at me if you still can't get it working from Ant...


On Mon, 7 Mar 2016, Al Le wrote:

Hello,

I'm facing a weird problem (IMHO) which, in short, is:

a node list passed as a parameter to a template can't be sorted.

The problem occurs only if I do the transformation from within Ant (I use Ant 
1.8.4). It does not occur if I perform it via a Java program or in XmlSpy or 
through http://xsltransform.net.

Here's an example.

The input file (a.xml) is:

<root>
   <a>BBB</a>
   <a>AAA</a>
</root>

The transformation (trans.xml) is:

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

 <xsl:output method="xml" />

 <xsl:template match="/">
   <Root>
     <xsl:call-template name="processThis">
       <xsl:with-param name="nodeList" select="/*/a"/>
     </xsl:call-template>
   </Root>
 </xsl:template>

 <xsl:template name="processThis">
   <xsl:param name="nodeList" />

     <xsl:for-each select="$nodeList">
       <xsl:sort /><!-- ***** This causes the problem -->
       <xsl:variable name="thisVal" select="." />
       <result value="{$thisVal}" />
     </xsl:for-each>
   </xsl:template>

</xsl:stylesheet>

The Ant script is:

<project default="trans">

   <target name="trans">
       <delete file="out.xml"/>
       <xslt style="trans.xsl" in="a.xml" out="out.xml"/>
   </target>

</project>


The expected output is:

<Root>
   <result value="AAA" />
   <result value="BBB" />
</Root>

But if I run the ant script, just an empty 'Root' element is generated, without 
child nodes.

If I comment out the line marked with '*****', the generated Root element does 
contain child elements, but unsorted (as one would expect in this case).

If I process the elements directly (and not in a template passing the list to 
process as a parameter), then I can use 'sort', and everything works as 
expected. Here is the 'direct' transformation:

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

   <xsl:output method="xml" />

   <xsl:template match="/">
       <Root>
           <xsl:for-each select="/*/a">
               <xsl:sort />
               <xsl:variable name="thisVal" select="." />
               <result value="{$thisVal}" />
           </xsl:for-each>
       </Root>
   </xsl:template>

</xsl:stylesheet>

So my question is: why isn't a list passed as a parameter to a template 
processed with a 'sort' option -- in Ant?

Thank you!
AL

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@ant.apache.org
For additional commands, e-mail: user-h...@ant.apache.org



Scot P. Floess             RHCT  (Certificate Number 605010084735240)
Chief Architect FlossWare  http://sourceforge.net/projects/flossware
                           http://flossware.sourceforge.net
                           https://github.com/organizations/FlossWare

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@ant.apache.org
For additional commands, e-mail: user-h...@ant.apache.org

Reply via email to