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

Confusion with the usage of preceding and preceding-

Subject: Confusion with the usage of preceding and preceding-sibling axes
From: Nisheet Verma <NisheetV@xxxxxxxxxxx>
Date: Thu, 18 Oct 2001 16:03:52 -0700
preceding sibling usage
I am witnessing a strange behavior with the understanding the concept of
preceding and preceding-sibling axis.     I am using xsl:key to construct a
list of unique elements and later on using xsl:for-each to display these
unique results. I am observing that both preceding and preceding-sibling are
producing the same output, which is surprising since, preceding-sibling is
supposed to return all the siblings that occur before the context node in
the document order and belong to the same parent.


I have used Xalan-j_2_2_D10 and Saxon 6.4.4 but both produce the same result
which makes me believe that I am missing something and there is a concept
that I haven't understood yet.

It would be clearer by reading the example below

source XML( This is a sample XML which has a similar structure to what I am
working on)

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- File Created on   03-Oct-2001 13:10:34-->
<!DOCTYPE ALBUM_LIST>
<ALBUM_LIST>
	<ALBUM ID="Q9001">
		<TRACK ID="001"/>
		<TRACK ID="002"/>
		<TRACK ID="003"/>
	</ALBUM>
	<ALBUM ID="Q9001">
		<TRACK ID="004"/>
		<TRACK ID="005"/>
		<TRACK ID="003"/>
	</ALBUM>
	<ALBUM ID="Q9001">
		<TRACK ID="006"/>
		<TRACK ID="002"/>
		<TRACK ID="003"/>
	</ALBUM>
</ALBUM_LIST>

I want to extract the list of all unique tracks, which would be tracks with
ID 001,002,003,004,005,006. Here is the XSL that I am using

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0" xmlns:lxslt="http://xml.apache.org/xslt">
<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:key name="ALBUM_TRACK"
match="ALBUM/TRACK[not(@ID=preceding::node()/@ID)]" use="@ID"/>

<xsl:template match="/" >
  <objects>
    <xsl:apply-templates select="ALBUM_LIST/ALBUM"/>
  </objects>
</xsl:template>

<xsl:template match="ALBUM">
    <xsl:for-each
select="TRACK[generate-id()=generate-id(key('ALBUM_TRACK',@ID))]">
      <object name="TRACK">
	<xsl:value-of select="@ID"/>
      </object>
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>


OUTPUT

<?xml version="1.0" encoding="UTF-8"?>
<objects>
<object  name="TRACK">001</object>
<object  name="TRACK">002</object>
<object  name="TRACK">003</object>
<object  name="TRACK">004</object>
<object  name="TRACK">005</object>
<object  name="TRACK">006</object>
</objects>

I think that preceding-sibling should produce the following output
<?xml version="1.0" encoding="UTF-8"?>
<objects>
<object  name="TRACK">001</object>
<object  name="TRACK">002</object>
<object  name="TRACK">003</object>
<object  name="TRACK">004</object>
<object  name="TRACK">005</object>
<object  name="TRACK">003</object>
<object  name="TRACK">006</object>
<object  name="TRACK">002</object>
<object  name="TRACK">003</object>
</objects>

As, within each individual ALBUM elemtns there are discinct TRACK elements
and hence I would not get any unique list of TRACK objects

This looks like a very simple XSL transformation. Now if I replace
preceding by preceding-sibling in the xsl:key definition, still the OUTPUT
is the SAME. Though there is a significant performance gain. I thought  that
this is wrong behavior and probably a bug in Xalan  but after getting the
same output with Saxon, I think that I don't understand the concept well .
How can preceding and preceding-sibling produce the same result. Using
preceding-sibling, the xsl-key should NOT store the unique Tracks, as it
cannot look beyond the parent of Track namely Album, but it seems that
preceding-sibling looks into all the ALBUM elements and thus selects unique
TRACK elements.

Please let me know what exactly am I missing in my understanding of
preceding and preceding-sibling.

thanx
Nisheet


 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.