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

Using key and position()

Subject: Using key and position()
From: Bhupendra Singh <skbhupendra@xxxxxxxxxxx>
Date: Tue, 16 Nov 2004 16:13:19 +0000 (GMT)
xsl key
Hi,
I have an input XML like this:

<action>
	- <ParentGroup> Node1 </ParentGroup>
	- <ChildGroup> Node1.1 </ChildGroup>
	- <Child Node1>1.1.1 </Child Node1>
	- <Child Node2>1.1.2 </Child Node2>
	- <ParentGroup> Node1 </ParentGroup>
	- <ChildGroup> Node1.2 </ChildGroup>
	- <Child Node1>1.2.1 </Child Node1>
	- <Child Node2>1.2.2 </Child Node2>
	- <ParentGroup> Node1 </ParentGroup>
	- <ChildGroup> Node1.3 </ChildGroup>
	- <Child Node1>1.3.1 </Child Node1>
	- <Child Node2>1.3.2 </Child Node2>
	- <ParentGroup> Node1 </ParentGroup>
	- <ChildGroup> Node1.3 </ChildGroup>
	- <Child Node1>1.3.x </Child Node1>
	- <Child Node2>1.3.y </Child Node2>

	- <ParentGroup> Node2 </ParentGroup>
	- <ChildGroup> Node2.1 </ChildGroup>
	- <Child Node1>2.1.1 </Child Node1>
	- <Child Node2>2.1.2 </Child Node2>
	- <ParentGroup> Node2 </ParentGroup>
	- <ChildGroup> Node2.2 </ChildGroup>
	- <Child Node1>2.2.1 </Child Node1>
	- <Child Node2>2.2.2 </Child Node2>
	- <ParentGroup> Node2 </ParentGroup>
	- <ChildGroup> Node2.3 </ChildGroup>
	- <Child Node1>2.3.1 </Child Node1>
	- <Child Node2>2.3.2 </Child Node2>
...........
</action>

I want to capture the position of each of the
<ParentGroup> elements and store it in a variable by
going through the document only once. 

<xsl:variable name="parentGroup">
  <xsl:for-each select="ParentGroup">
    <parentgroup id="generate-id()" pos="position()"/>
  </xsl:for-each>
</xsl:variable>


Then I want to use this variable to get the position
of each <ParentGroup> and find its coresponding
<ChildGroup> and <Child Nodes>.

When I print the contents of the variable(@id and
@pos), then I find that the content is correct, but
when I try to retreive the content using key then I
get nothing.  Here is the XSL that I have.


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

<!-- Key to group distinct ChildGroup's -->
<xsl:key name="SEC_CUST" match="ChildGroup" use="."/>

<!-- Key to group distinct ParentGroup's -->
<xsl:key name="PRI_CUST" match="ParentGroup" use="."/>

<!-- Key to find position of ParentGroup's -->
<xsl:key name="parentGroups" match="parentGroup"
use="@id"/>

<xsl:template match="/">
	<xsl:apply-templates/>
</xsl:template>


<xsl:template match="action">
<TRANS_OUTPUT>
<CUSTOMERS>
<xsl:variable name="var_24" select="Child Node1" />
<xsl:variable name="var_27" select="Child Node2" />

<!-- Variable to store the posittion of each
ParentGroup nodes -->
<xsl:variable name="parentGroup"> 
  <xsl:for-each select="ParentGroup">
    <parentgroup>
    <xsl:attribute name="id" select="generate-id()"/>
    <xsl:attribute name="pos" select="position()"/>
    </parentgroup>
  </xsl:for-each>
</xsl:variable>

  <xsl:for-each select="$var_21[count(. |
key('PRI_CUST', .)[1]) = 1]">
  <PRIMARY CUSTOMER>
     <xsl:variable name="priId" select="." />
     <xsl:variable name="p"
select="key('parentGroups', generate-id())/@pos" />
     <PRI_HEADER><xsl:value-of select="$p"/>
          <xsl:value-of select="$var_27[$p]"/>
     </PBU_HEADER>
     <PRIMARY_CUST_DESC>
        <xsl:value-of select="$var_24[$p]"/>
        <xsl:text> </xsl:text>
        <xsl:value-of select="$priId"/>
     </PRIMARY_CUST_DESC>

     <SECONDARY CUSTOMER> 
      <xsl:for-each select= SECONDARY CUSTOMER....
      ....group &.Do processing for Sec customers
     </SECONDARY CUSTOMER> 

    </End of for loop for Primary cusotmer>
    </PRIMARY CUSTOMER>
</CUSTOMERS>
</TRANS_OUTPUT>


In the above XSL..I get the value of $p undefined 

<xsl:variable name="p" select="key('parentGroups',
generate-id())/@pos" />

So when I access $var_27[$p] and $var_24[$p] ..I get
nothing.

     <PRI_HEADER><xsl:value-of select="$p"/>
          <xsl:value-of select="$var_27[$p]"/>
     </PBU_HEADER>
     <PRIMARY_CUST_DESC>
        <xsl:value-of select="$var_24[$p]"/>
        <xsl:text> </xsl:text>
        <xsl:value-of select="$priId"/>
     </PRIMARY_CUST_DESC>


Can someone please let me know what has gone wrong.




		
___________________________________________________________ 
Win a castle for NYE with your mates and Yahoo! Messenger 
http://uk.messenger.yahoo.com

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.