xsl-list
[Top] [All Lists]

[xsl] Newbie wonders why the variable can change value?

2011-02-21 15:53:51

I am making a hierarchy from a flattened input XML. It works, and it outputs a 
nested hierarchy which is correct. But I do not understand how the XSL 
variables can work. 

For instance, say that my original 5 ACCTs represent one "organization" with 
two "subsidiaries" and each sub has two "branches". In the input, attributes 
"Acct_ID and "Parent_Acct_ID" link things into a tree. The output will look like
<ORG ...>
<SUBS ...>
<BRAN ...>
</BRAN>
<BRAN ...>
</BRAN>
</SUBS ...>
<SUBS ...>
<BRAN ...>
</BRAN>
<BRAN ...>
</BRAN>
</SUBS ...>
</ORG>

A template that only matches the top of the tree, the Org-level ACCT, processes 
and nests the appropriate siblings as follows :

<xsl:variable name="currentOR" select="HIERARCHY_Info/@Acct_ID"/>
<xsl:apply-templates  mode="RE" 
select="../ACCT[HIERARCHY_Info/@Prnt_Acct_ID=$currentOR]"/>     
                                
I use the variable, because the following alternative coding returns none of 
the sibling nodes,  nodes, because (I think) it compares the siblings' 
parent-acct-IDs to their own acct-IDs: 

<xsl:apply-templates  mode="RE" 
select="../ACCT[HIERARCHY_Info/@Prnt_Acct_ID=HIERARCHY_Info/@Acct_ID]"/>        

The template that processes the sibling ACCT uses a "choose" to determine the 
level of that ACCT and does much the same to nest BRANs within SUBS:

<xsl:variable name="currentSU" select="HIERARCHY_Info/@Acct_ID"/>
<xsl:apply-templates  mode="RE" 
select="../ACCT[HIERARCHY_Info/@Prnt_Acct_ID=$currentSU]"/>     
  
All that works, but, it seems to me that it is resetting the variable 
$currentSU for each of the ACCTs that are Subsidiary-level. But you cannot 
reset a variable, it says on all the tutorials. Why does it work? 

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>