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

Odd bug? in msxml3 xslt implementation

Subject: Odd bug? in msxml3 xslt implementation
From: Unico Hommes <Unico@xxxxxxxx>
Date: Tue, 27 Mar 2001 13:01:09 +0200
msxml3 position
Hi all,

I have found a really weird behavior in microsofts xslt processor.

Consider the following xml document:

<itemlist>
	<item>
		<name>item name</name>
	</item>
	<item>
		<name>item name</name>
	</item>
	<item>
		<name>item name</name>
	</item>
	<item>
		<name>different item name</name>
	</item>
</itemlist>

... and the following xsl transformation document for it:

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

	<xsl:template match="/itemlist">
		<p>
		<xsl:call-template name="itemtemplate">
			<xsl:with-param name="name">none</xsl:param>
			<xsl:with-param name="$position">1</xsl:position>
		</xsl:call-template>
		</p>
	</xsl:template>

	<xsl:template name="itemtemplate">
		<xsl:param name="name" />
		<xsl:param name="position" />
		<xsl:choose>
			<xsl:when test="item[$position]/name != $name">
				<xsl:value-of select="item[$position]/name"
/> != <xsl:value-of select="$name" /><br />
			</xsl:when>
			<xsl:otherwise>
				<xsl:value-of select="item[$position]/name"
/> == <xsl:value-of select="$name" /><br />
</xsl:otherwise>
		</xsl:choose>
		<xsl:if test="$position != count(product)">
			<xsl:call-template name="itemtemplate">
				<xsl:with-param name="name"
select="item[$position]/name" />
				<xsl:with-param name="position"
select="$position + 1" />
			</xsl:call-template>
		</xsl:if>
	</xsl:template>

</xsl:stylesheet>

... wich after processing produces the following:

<?xml version="1.0" encoding="UTF-16"?>
<p>
	item name != none<br />
	item name != item name<br />
	item name == item name<br />
	different item name != item name<br />
</p>

... to explain a little further what I am trying to do in my xslt ...
... I want to output only those item names that are not equal to the
previous item names as long as there are items to check. So :
	<xsl:if test="$position != count(product)">
I recursively call the named template 'itemtemplate' :
	<xsl:call-template name="itemtemplate">
with the current item name :
	<xsl:with-param name="name" select="item[$position]/name" />
and the next position :
	<xsl:with-param name="position" select="$position + 1" />

Now taking a look at the output it is obvious that :
	item name != item name
is just not expected.


... But check out what happens if I reverse the test proposition, that is to
say, when instead of:

		<xsl:choose>
			<xsl:when test="item[$position]/name != $name">
				<xsl:value-of select="item[$position]/name"
/> != <xsl:value-of select="$name" /><br />
			</xsl:when>
			<xsl:otherwise>
				<xsl:value-of select="item[$position]/name"
/> == <xsl:value-of select="$name" /><br />
</xsl:otherwise>
		</xsl:choose>

... I write:

		<xsl:choose>
			<xsl:when test="item[$position]/name == $name">
				<xsl:value-of select="item[$position]/name"
/> == <xsl:value-of select="$name" /><br />
			</xsl:when>
			<xsl:otherwise>
				<xsl:value-of select="item[$position]/name"
/> != <xsl:value-of select="$name" /><br />
</xsl:otherwise>
		</xsl:choose>

... (substituting the inequality check into an equality check)

... in this case the output is :

<?xml version="1.0" encoding="UTF-16"?>
<p>
	item name != none<br />
	item name == item name<br />
	item name == item name<br />
	different item name != item name<br />
</p>

... wich is what could be expected.

I found this a particularly weird bug.

Now I have an additional question for those that have followed me thus far.
Suppose the items within my xml source document did not occur in a specific
order but I wanted to output only unique item names. So for instance my xml
document looked like so :

<itemlist>
	<item>
		<name>item name</name>	
	</item>
	<item>
		<name>different item name</name>	
	</item>
	<item>
		<name>item name</name>	
	</item>
</itemlist>

... but I wanted to output only unique item names as in :

<p>
	item name<br />
	different item name<br />
</p>

... I wouldn't be able to use the above xslt since it only checks for
equality to the previous item name, unless I found a way to sort the items
by item name in wich case I cannot use a the named template strategy I
guess. Does anybody have a solution to this problem, is there perhaps an
xpath statement that would allow me to filter down my node set of <item>s to
only those that have unique item names, in wich case I could use iteration ?

Regards,

Unico Hommes

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


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.