RE: [xsl] RE: Testing values from parent nodes

Subject: RE: [xsl] RE: Testing values from parent nodes
From: "M. David Peterson" <m.david@xxxxxxxxxx>
Date: Wed, 26 May 2004 03:59:12 -0600
FYI...  again, without seeing the context in which you are processing
'RR_group4' its tough to say if this is applicable, but you could also
use the following method that reduces the use of conditional logic
elements like xsl:if or xsl:choose[when][otherwise] by using the match
attribute of xsl:template to test for a particular value.  The following
tests for 3 possible values and outputs the associated text that
matches.

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
version="1.0">
<xsl:output method="text"/>
<xsl:template match="/">
  <xsl:apply-templates
select="RR/RR_row/RR_group1/RR_group2/RR_group3/RR_group4"/>
</xsl:template>
<xsl:template match="RR_group4[ancestor::RR_group2/type = 1]">
type 1
</xsl:template>
<xsl:template match="RR_group4[ancestor::RR_group2/type = 2]">
type 2
</xsl:template>
<xsl:template match="RR_group4[ancestor::RR_group2/type = 3]">
type 3
</xsl:template>
</xsl:stylesheet>

> -----Original Message-----
> From: M. David Peterson [mailto:m.david@xxxxxxxxxx]
> Sent: Wednesday, May 26, 2004 3:42 AM
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: RE: [xsl] RE: Testing values from parent nodes
> 
> Hey Neil,
> 
> I'm assuming that based on your sample code and the source XML that
you
> are interested in the value of RR_group2/type as opposed to
> RR_group1/type (which doesnt exist)?  If so, and without seeing the
> context in which you are processing RR_group4, heres a sample that
> should help get you where you need to go...
> 
> <?xml version="1.0"?>
> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
> version="1.0">
> <xsl:output method="text"/>
> <xsl:template match="/">
>   <xsl:apply-templates
> select="RR/RR_row/RR_group1/RR_group2/RR_group3/RR_group4"/>
> </xsl:template>
> <xsl:template match="RR_group4">
>   <xsl:if test="ancestor::RR_group2[type = '1']">
>     hello world
>   </xsl:if>
> </xsl:template>
> </xsl:stylesheet>
> 
> This will output "hello world" if the value of
ancestor::RR_group2/type
> is equal to 1.  I treated 1 as a string by using the single quotes but
> this would work just as well without them given that 1 can be treated
as
> a string or a number by the processor.  You could also use <xsl:if
> test="ancestor::RR_group2/type = '1'"> and get the same result.  The
> difference between these two methods is show when they are used to
> process the node and its children (as opposed to test for a value.)
> "ancestor::RR_group2/type" puts 'type' into context where as
> "ancestor::RR_group2[type]" puts 'RR_group2' into context if it has a
> child with a local-name() of 'type'.
> 
> Let me know if this helps get you to where you need to be...
> 
> Best of luck!
> 
> <M:D/>
> 
> > -----Original Message-----
> > From: SMITH Neil [mailto:neil.smith@xxxxxxxx]
> > Sent: Wednesday, May 26, 2004 3:07 AM
> > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> > Subject: [xsl] RE: Testing values from parent nodes
> >
> > <RR>
> > 	<RR_row>
> > 		<ind_no>81723</ind_no>
> > 		<pos_acad_m_no>1</pos_acad_m_no>
> > 		<pos_acad_lib>Emeritierte(r)
> Professor(in)</pos_acad_lib>
> > 		<et25_lng>2</et25_lng>
> > 		<RR_group1>
> > 			<gr_no>330</gr_no>
> > 			<gr_nom>Analysis: Gruppe Kaup</gr_nom>
> > 			<RR_group2>
> > 				<type>1</type>
> > 				<type_lib>Publications</type_lib>
> > 				<RR_group3>
> > 					<cle>15381</cle>
> > 					<RR_group4>
> > 						<ordre>10</ordre>
> > 						<text>G. Bissig: \ber
> die Stabilitdt
> > separierbarer Bldtterungen. Dissertation Fribourg, Juni 2002</text>
> > 						<date_debut/>
> > 						<date_fin/>
> > 						<financement/>
> >
> <montant>0</montant>
> > 					</RR_group4>
> > 				</RR_group3>
> > 			</RR_group2>
> >
> >
> > Here is a part of my XML file that I am parsing to HTML.
> > Here is my problem, I would like to test the value of
> > /RR/RR_Row/RR_group1[type=1]  while I am parsing the values of the
> > RR_group4 node (the output is not the same depending on the type).
> >
> > I tried :
> >         <xsl:if
> test="ancestor::RR/RR_row/RR_group1/RR_group2[type=1]">
> > 		But that doesn't work (crashes XMLSPY...)
> > 	<xsl:if test="/RR/RR_row/RR_group1/RR_group2[type=1]">
> > 		Same same...
> >
> >
> > Could someone please help me as I have been stuck on this for a
couple
> of
> > days now...
> >
> > Thanks a lot
> > Best regards,
> > Neil.
> >
> >
> >
> > Neil Smith
> > Analyste Programmeur
> > Universiti de Fribourg
> > Av. de l'Europe 20
> > CH - 1700 Fribourg
> > Til. +41 26 300 7091

Current Thread