Re: problem using self::node() in for-each
Hi Garrett, > The inf_source_id in the <information type="info"> refers to the > inf_source_id in the <information type="source"> > i.e. Information 1 has inf_source_id of 2 meaning it came from Source 2. > > I'm trying to output all the inf_text using xsl:for-each along with the name > of the source it has a reference to through inf_source_id. I think that the problem is with the setting of the $inf_source variable here: > <xsl:variable name="inf_source" > select="/root/information/instance[inf_type = 'source' and (inf_source_id = > ./inf_source_id)]/inf_name"/> In the predicate, you test whether: inf_source_id = ./inf_source_id This is always true (the <inf_source_id> of the context node is always equal to itself), so the $inf_source is set to the <inf_name> children of all the <instance> elements whose <inf_type> is 'source'. You should be using the current() function to get the <inf_source_id> of the current node within the <xsl:for-each>, which is a <instance> element whose <inf_type> is 'info'. Try the path: /root /information /instance[inf_type = 'source' and inf_source_id = current()/inf_source_id] /inf_name You might also consider using a key to retrieve the relevant <instance> element. Index all the <instance> elements whose <inf_type> is 'source' by their <inf_source_id>: <xsl:key name="sources" match="instance[inf_type = 'source']" use="inf_source_id" /> and then retrieve them with the key() function: <xsl:variable name="inf_source" select="key('sources', inf_source_id)" /> This is easier to write, and will be more efficient if you have large files to deal with. Cheers, Jeni --- Jeni Tennison http://www.jenitennison.com/
PURCHASE STYLUS STUDIO ONLINE TODAY!
Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!
Download The World's Best XML IDE!
Accelerate XML development with our award-winning XML IDE - Download a free trial today!
Subscribe in XML format