[ 
http://nagoya.apache.org/jira/browse/XALANJ-2004?page=comments#action_56153 ]
     
Mukul Gandhi commented on XALANJ-2004:
--------------------------------------

Here are some more observations..

Please consider this example..

XML file
--------
<?xml version="1.0"?>
<Parent>
   <!-- node elements -->
   <node>a</node>
   <node>s</node>
   <node>d</node>
   <node>f</node>
   <node>g</node>
   <node>h</node>
   <node>j</node>
   <node>k</node>
   <node>l</node>       
   <!-- node1 elements -->
   <node1>1</node1>
   <node1>2</node1>
   <node1>3</node1>
</Parent>

XSL file
--------
<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; version="1.0">
 
<xsl:output method="text" /> 

<xsl:template match="/Parent">
  <xsl:for-each select="node | node1"> 
    <xsl:if test="position() != last()">
      <xsl:text>,</xsl:text>  
     </xsl:if>  
   </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

This works fine! And produces output:
,,,,,,,,,,,

But this XSL -
--------------
<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; version="1.0">
 
<xsl:output method="text" /> 

<xsl:template match="/Parent">
  <xsl:for-each select="node | node1[1]"> 
<!--  or, <xsl:for-each select="node[1] | node1"> -->
    <xsl:if test="position() != last()">
       <xsl:text>,</xsl:text>  
     </xsl:if>  
  </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

does'nt work as expected.. and produces output:
,

It therefore seems to me, that the test, position() != last() is *not working 
correctly when context contains a union operator(|) and a predicate..*

Regards,
Mukul

> Seems a Xalan bug
> -----------------
>
>          Key: XALANJ-2004
>          URL: http://nagoya.apache.org/jira/browse/XALANJ-2004
>      Project: XalanJ2
>         Type: Bug
>   Components: Xalan
>     Versions: 2.6
>  Environment: Windows 2000 Prof, Xalan-J 2.6.0, JDK 1.4(the bundled Xalan 
> disabled)
>     Reporter: Mukul Gandhi

>
> Hello,
> I seem to have discovered a Xalan bug(Xalan-J 2.6.0)! I found it while 
> solving a problem posted at a public newsgroup..
> The problem posted was -
> Subject: Grouping by two or any number
> --------------------------------------
> I have the following xml
> <Parent>
>   <node>a</node>
>   <node>s</node>
>   <node>d</node>
>   <node>f</node>
>   <node>g</node>
>   <node>h</node>
>   <node>j</node>
>   <node>k</node>
>   <node>l</node>
> </Parent>
> Need to print in following format (into groups of two; or could be any other 
> group-size)
> group 1 - a,s
> group 2 - d,f
> group 3 - g,h
> group 4 - j,k
> group 5 - l
> To solve this problem, I wrote the following stylesheet -
> <?xml version="1.0"?> 
> <xsl:stylesheet
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
> version="1.0">
>  
> <xsl:output method="text" /> 
> <xsl:param name="group-size" select="3" />
>  
> <xsl:template match="/Parent">
>    <!-- calculate the no of "node" elements, which are left as a fraction; 
> which are to be displayed in the last group -->
>    <xsl:variable name="n" select="count(node) -
> (floor((count(node) div $group-size)) * $group-size)"
> />
>    
>    <xsl:for-each select="node">
>      <!-- determine group boundary; this if test stops at the last "node" 
> element of the group -->
>      <xsl:if test="(position() mod $group-size) = 0">
>        group <xsl:value-of select="floor(position()
> div $group-size)" /><xsl:text> - </xsl:text>
>        <!-- display group members -->
>        <xsl:for-each select=". |
> preceding-sibling::node[position() &lt;= ($group-size
> - 1)]">         
>          <xsl:value-of select="." /><xsl:if
> test="(position() mod $group-size) !=
> 0"><xsl:text>,</xsl:text></xsl:if>       
>        </xsl:for-each>
>        <xsl:text>&#xa;</xsl:text>
>      </xsl:if> 
>      <!-- this if test processes the last group; whose number of group 
> members will be less than the group-size -->
>      <xsl:if test="((position() = last()) and
> ((position() mod $group-size) != 0))">
>        group <xsl:value-of select="floor(position()
> div $group-size) + 1" /><xsl:text> - </xsl:text>
>        <xsl:for-each select=". |
> preceding-sibling::node[position() &lt; $n]">
>          <xsl:value-of select="." /><xsl:if
> test="position() !=
> last()"><xsl:text>,</xsl:text></xsl:if> 
>        </xsl:for-each>
>        <xsl:text>&#xa;</xsl:text>
>      </xsl:if>
>    </xsl:for-each>
> </xsl:template>
>    
> </xsl:stylesheet>
> I invoke Xalan like this:
> java org.apache.xalan.xslt.Process -in file.xml -xsl
> file.xsl -PARAM group-size 2
> The output is fine for -PARAM group-size values of
> 1,2,3 & 4. But for -PARAM group-size values of 5 and
> above, the ouput is not coming as expected. For e.g.,
> for -PARAM group-size 5, the output received is -
> group 1 - a,s,d,f,g
> group 2 - h,
> I tested the same XSL with Saxon 8 and MSXSL 4,
> and both produce correct result for all the cases(i.e. for any group-size).
> Both Saxon and MSXSL produce the following output for
> group-size=5 -
> group 1 - a,s,d,f,g
> group 2 - h,j,k,l
> Could it be a Xalan bug?
> Regards,
> Mukul

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://nagoya.apache.org/jira/secure/Administrators.jspa
-
If you want more information on JIRA, or have a bug to report see:
   http://www.atlassian.com/software/jira


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to