Re: [xsl] Variable Scope

Subject: Re: [xsl] Variable Scope
From: Karl Stubsjoen <kstubs@xxxxxxxxx>
Date: Tue, 17 May 2005 09:36:51 -0700
The exact error is:

Variable or Param is not defined or is out of scope.


On 5/12/05, Michael Kay <mike@xxxxxxxxxxxx> wrote:
> That's the simplified version?
>
> What's the actual error message you are getting?
>
> Michael Kay
> http://www.saxonica.com/
>
> > -----Original Message-----
> > From: Karl Stubsjoen [mailto:kstubs@xxxxxxxxx]
> > Sent: 11 May 2005 21:12
> > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> > Subject: Re: [xsl] Variable Scope
> >
> > Ok, Templates are:
> > validate_base.xsl  (base template)
> > validate_sped.xsl  (imports validate_base; includes incl_GradAge.xsl)
> > incl_GradeAge.xsl (included file with MAX_DATE problem)
> >
> > (much code has been removed)
> > Also, below you'll find comments for the LIST with the
> > following syntax:
> >
> > <!-- LIST LOOK HERE:  ... -->
> >
> > validate_base.xsl
> > ========================================
> > <xsl:stylesheet
> > xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; version="1.0"
> >       xmlns:sd="http://ade.az.gov/studentdetail";
> >       xmlns:dt="urn:schemas-microsoft-com:xslt">
> >
> > <xsl:output method="xml" encoding="UTF-8"/>
> > <xsl:param name="STEP">1</xsl:param>
> >
> > <!-- copy root -->
> >       <xsl:variable name="CURRENT" select="/"/>
> >
> > <!-- global lookups -->
> >       <xsl:variable name="TRACE"
> > select="/root/StudentDetail/@Trace" />
> >       <xsl:variable name="VERBOSE">
> >               <xsl:choose>
> >               <xsl:when
> > test="string(/root/StudentDetail/@Verbose)"><xsl:value-of
> > select="/root/StudentDetail/@Verbose" /></xsl:when>
> >               <xsl:otherwise>1</xsl:otherwise>
> >               </xsl:choose>
> >       </xsl:variable>
> >       <xsl:variable name="FISCAL_YEAR"
> > select="/root/StudentDetail/@FiscalYear" />
> >       <xsl:variable name="REGULAR_AZ_COUNTIES"
> > select="$sd_lookups//recordset[@rsName='Counties']/record[fiel
> > d[@fieldname='regular-az-county']
> > = '1']" />
> >       <xsl:variable name="PUBLIC_REFTYPES"
> > select="$sd_lookups//recordset[@rsName='RefTypes']/record[fiel
> > d[@fieldname='DOR-Type']='PUBLIC']/field[@fieldname='RefTypeID']"/>
> >       <xsl:variable name="CHARTER_REFTYPES"
> > select="$sd_lookups//recordset[@rsName='RefTypes']/record[fiel
> > d[@fieldname='DOR-Type']='CHARTER']/field[@fieldname='RefTypeID']"/>
> >       <xsl:variable name="NEEDS"
> > select="$sd_lookups//recordset[@rsName='NeedCodes']/record/fie
> > ld[@fieldname='NeedCode']"/>
> >
> > <!-- global constants -->
> >       <xsl:variable name="REFTYPE_ACCOMMODATION">1029</xsl:variable>
> >       <xsl:variable name="COUNTYTYPE_OUTOFSTATE">353</xsl:variable>
> >       <xsl:variable
> > name="ACCOMMODATION">01</xsl:variable><!-- this is the
> > "T" value of CTDS -->
> >       <xsl:variable name="ELEMENTARY">04</xsl:variable><!--
> > this is the "T"
> > value of CTDS -->
> >       <xsl:variable name="HIGHSCHOOL">05</xsl:variable><!--
> > this is the "T"
> > value of CTDS -->
> >       <xsl:variable
> > name="D_LEVEL_ACCOMMODATION">00</xsl:variable><!-- this
> > is the "D" value of CTDS -->
> >
> > <!-- LIST LOOK HERE:  this is the global variable which loses
> > scope -->
> >       <xsl:variable name="MAX_DATE">
> >               <xsl:call-template name="CreateNewDate">
> >                       <xsl:with-param name="start_year"
> > select="$FISCAL_YEAR" />
> >                       <xsl:with-param
> > name="start_month">06</xsl:with-param>
> >                       <xsl:with-param
> > name="start_day">30</xsl:with-param>
> >               </xsl:call-template>
> >       </xsl:variable>
> >
> >       <!-- DOA -->
> >       <xsl:variable name="DOA_REFTYPE"
> > select="root/recordset[@rsName='EntityOwnerInfo']/record/field
> > [@fieldname='RefTypeID']"
> > />
> >       <xsl:variable name="DOA_ENTITYID"
> > select="root/recordset[@rsName='EntityOwnerInfo']/record/field
> > [@fieldname='EntityID']"
> > />
> >       <xsl:variable name="DOA_CTDS"
> > select="root/recordset[@rsName='EntityOwnerInfo']/record/field
> > [@fieldname='CTDS']"
> > />
> >       <xsl:variable name="DOA_COUNTY"
> > select="root/recordset[@rsName='EntityOwnerInfo']/record/field
> > [@fieldname='RefCountyID']"
> > />
> >
> >       <!-- ENTITY -->
> >       <xsl:variable name="ENTITY_NATURE"
> > select="root/recordset[@rsName='EntityInfo']/record/field[@fie
> > ldname='Nature']"
> > />
> >       <xsl:variable name="ENTITY_REFTYPE"
> > select="root/recordset[@rsName='EntityInfo']/record/field[@fie
> > ldname='RefTypeID']"
> > />
> >       <xsl:variable name="ENTITY_ENTITYID"
> > select="root/recordset[@rsName='EntityInfo']/record/field[@fie
> > ldname='EntityID']"
> > />
> >       <xsl:variable name="ENTITY_CTDS"
> > select="root/recordset[@rsName='EntityInfo']/record/field[@fie
> > ldname='CTDS']"
> > />
> >       <xsl:variable name="ENTITY_COUNTY"
> > select="root/recordset[@rsName='EntityInfo']/record/field[@fie
> > ldname='RefCountyID']"
> > />
> >
> > <!--
> >       resulting xml source should resemble
> >       <results>
> >               <result rule="name of rule" pass="1 | 0"  1 =
> > pass, 2 = fail
> > | non-existent may not be tested">
> >
> >             </result>
> >         </results>
> >
> > -->
> >
> >
> > <xsl:template match="/">
> >       <xsl:element name="results">
> >
> >       <xsl:choose>
> >               <xsl:when test="$STEP=1">
> >
> > <!-- LIST LOOK HERE:  this is the default step to follow (and only
> > implemented step so far) -->
> >                       <xsl:call-template name="STEP_1"/>
> >
> >               </xsl:when>
> >       <!-- .. code removed -->
> >
> >       </xsl:choose>
> >
> >       </xsl:element>
> > </xsl:template>
> >
> >       <!-- .. code removed -->
> >
> > <xsl:template name="calculatestudentage">
> >       <xsl:param name="student_dob"/>
> >       <xsl:param name="date_of_occurrence"/>
> >
> >       <xsl:choose>
> >               <xsl:when test="not(string($student_dob)) or
> > not(string($date_of_occurrence))">
> >                       <xsl:text>-1</xsl:text>
> >               </xsl:when>
> >               <xsl:otherwise>
> >                       <xsl:variable name="Yr1"
> > select="dt:format-date($student_dob,'yyyy')"/>
> >                       <xsl:variable name="Yr2"
> > select="dt:format-date($date_of_occurrence,'yyyy')"/>
> >                       <xsl:variable name="MoDa1"
> > select="concat(dt:format-date($student_dob,'MM'),dt:format-dat
> > e($student_dob,'dd'))"/>
> >                       <xsl:variable name="MoDa2"
> > select="concat(dt:format-date($date_of_occurrence,'MM'),dt:for
> > mat-date($date_of_occurrence,'dd'))"/>
> >
> >                       <!-- year diff calculation -->
> >                       <xsl:variable name="sYrDiff"
> > select="$Yr2 - $Yr1"/>
> >
> >                       <!-- final age calculation consider
> > month and day of birth -->
> >                       <xsl:variable name="student_age">
> >                               <xsl:choose>
> >                                       <xsl:when test="$MoDa1
> > &gt; $MoDa2">
> >                                               <xsl:value-of
> > select="$sYrDiff - 1"/>
> >                                       </xsl:when>
> >                                       <xsl:otherwise>
> >                                               <xsl:value-of
> > select="$sYrDiff"/>
> >                                       </xsl:otherwise>
> >                               </xsl:choose>
> >                       </xsl:variable>
> >
> >               <!-- return result -->
> >                       <xsl:value-of select="$student_age"/>
> >               </xsl:otherwise>
> >       </xsl:choose>
> > </xsl:template>
> >
> > <!-- LIST LOOK HERE:  if you stumble upon this, I could use help with
> > a better date adder function : ) -->
> > <xsl:template name="fn_date_add">
> >       <xsl:param name="current_date"/>
> >       <xsl:param name="days"/>
> >
> >       <xsl:variable name="Yr"
> > select="dt:format-date($current_date,'yyyy')"/>
> >       <xsl:variable name="Mo"
> > select="dt:format-date($current_date,'MM')"/>
> >       <xsl:variable name="Da"
> > select="number(dt:format-date($current_date,'dd')) + $days"/>
> >
> >       <xsl:value-of select="concat($Yr, '-', $Mo, '-', $Da)"/>
> >
> > </xsl:template>
> >
> >
> >
> > </xsl:stylesheet>
> > ========================================
> >
> > validate_sped.xsl
> > ========================================
> > <xsl:stylesheet
> > xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; version="1.0"
> >       xmlns:sd="http://ade.az.gov/studentdetail";
> >       xmlns:fx="urn:schemas-microsoft-com:xslt">
> >
> >       <xsl:import href="../../ValidationTemplates/validate_base.xsl"/>
> >
> > <!-- LIST LOOK HERE:  this is the included file which references
> > MAX_DATE, look below for execution/flow -->
> >       <xsl:include href="SPED/fn_Concurrency.xsl"/>
> >
> >
> >       <!-- <xsl:include
> > href="SupportPrograms/incl_JohnsonOMalley.xsl" /> -->
> >
> >       <xsl:include href="SPED/incl_DistrictOfAttendance.xsl"/>
> >       <xsl:include href="SPED/incl_SchoolLevelCheck.xsl"/>
> >       <xsl:include href="SPED/incl_DistrictOfResidence.xsl"/>
> >       <xsl:include href="SPED/incl_CED-DOA-DOR.xsl"/>
> >       <xsl:include href="SPED/incl_SPEDServiceCode.xsl"/>
> >       <xsl:include href="SPED/incl_NeedCodes.xsl"/>
> >
> >       <xsl:include href="SPED/incl_ArizonaSchoolDeafBlind.xsl"/>
> >       <xsl:include href="SPED/incl_SPEDDors.xsl"/>
> >
> > <!-- LIST LOOK HERE:  this is the included file which call the above
> > included file and eventually has trouble with MAX_DATE -->
> >       <xsl:include href="SPED/incl_GradeAge.xsl"/>
> >
> >       <xsl:include href="SPED/incl_OverlappingServicesForSPED.xsl"/>
> >       <xsl:include href="SPED/incl_SPEDMultiGradeService.xsl"/>
> >       <xsl:include href="SPED/incl_SPEDExitReason.xsl"/>
> >       <xsl:include href="SPED/incl_SynchronizeSpedGrade.xsl"/>
> >
> >       <xsl:variable name="sd_rules"
> > select="document('SPED/SPED_rules.xml')"/>
> >       <xsl:variable name="sd_lookups"
> > select="document('SPED/SPED_lookups.xml')"/>
> >       <xsl:variable name="sd_matrix"
> > select="document('SPED/SPED_matrix.xml')"/>
> >
> > <!--
> > SPED INTEGRITY VALIDATION
> >
> > -->
> >
> > <xsl:template name="STEP_1">
> > <!-- LIST LOOK HERE:  entry template rule called from
> > validate_base.xsl -->
> >
> >
> >       <!-- TODO's -->
> >               <xsl:element name="TODO">3.1.9 CTD's 000400 and
> > 000500 not valid</xsl:element>
> >               <xsl:element name="TODO">3.1 (10) Each school
> > approved to teach
> > student grade</xsl:element>
> >               <xsl:element name="NOT_IMPLEMENTED">Rule
> > 3.1.12.12 pending business
> > rule analysis</xsl:element>
> >
> >
> >       <!--
> >               Rule 3.1
> >               Student Counts Needs Rules      -->
> >
> >                       <!-- 3. District of Attendance -->
> >                       <!-- 4. School -->
> >                       <!-- 5. District of Residence -->
> >                       <!-- 6. CEC/DOA/DOR Valid -->
> >                       <!-- 7, 8 -->
> >                       <!-- 11. SPED Service Code -->
> >                       <!-- 12. Valid Need Code characteristics -->
> >                       <!-- 13, 14, 15 -->
> >                       <!-- 16 -->
> >
> > <!-- LIST LOOK HERE:  this is the call to incl_GradeAge.xsl -->
> >                       <!-- 17. Age -->
> >                                       <xsl:call-template
> > name="GradeAge"/>
> >
> >       <!--
> >               Rule 3.2
> >               SPED DORs       -->
> >       <!--
> >               Rule 3.3
> >               Overlapping Services for a SPED Need    -->
> >       <!--
> >               Rule 3.4
> >               Multiple Grades or Services     -->
> >       <!--
> >               Rule 3.5
> >               Initial IEP
> >       <!--
> >               Rule 3.6
> >               SPED Exit Reason/Age/Grade Validation   -->
> >
> >       <!--
> >               Rule 3.7
> >               Synchronize SPED Grade / Membership Grade       -->
> >
> > </xsl:template>
> >
> > </xsl:stylesheet>
> > ========================================
> >
> > incl_GradeAge.xsl
> > ========================================
> > <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
> > version="1.0" xmlns:sd="http://ade.az.gov/studentdetail";
> >       xmlns:fx="urn:schemas-microsoft-com:xslt"
> >       xmlns:fn="urn:function-element-results"
> >       exclude-result-prefixes="sd fx fn">
> >
> >       <xsl:variable name="DORExceptions"
> > select="$sd_lookups//recordset[@rsName='RefTypes']/record[fiel
> > d[@fieldname='validates-GradeDOR']='1']/field[@fieldname='RefTypeID']"
> > />
> >       <xsl:variable name="SPEDDor"
> > select="/root/recordset[@rsName='SPEDDor']/record[field[@field
> > name='ResidenceRefTypeID'
> > and not(.= $DORExceptions)]]" />
> >       <xsl:variable name="AllowedGradeID"
> > select="$sd_lookups//recordset[@rsName='GradeLookup']/record[f
> > ield[@fieldname='Grade'
> > and (.= 'KG' or .= 'PS' or .= 'UE')]]/field[@fieldname='GradeID']" />
> >       <xsl:variable name="UE_Grade_ID"
> > select="$sd_lookups//recordset[@rsName='GradeLookup']/record[f
> > ield[@fieldname='Grade']
> > = 'UE']/field[@fieldname='GradeID']" />
> >       <xsl:variable name="PS_Grade_ID"
> > select="$sd_lookups//recordset[@rsName='GradeLookup']/record[f
> > ield[@fieldname='Grade']
> > = 'PS']/field[@fieldname='GradeID']" />
> >       <xsl:variable name="Group_B_Need_Codes"
> > select="$sd_lookups//recordset[@rsName='NeedCodes']/record[fie
> > ld[@fieldname='validates-GradeAge']='1']/field[@fieldname='NeedCode']"
> > />
> >       <xsl:variable name="KG_Grade_ID"
> > select="$sd_lookups//recordset[@rsName='GradeLookup']/record[f
> > ield[@fieldname='Grade']
> > = 'KG']/field[@fieldname='GradeID']" />
> >
> > <!-- LIST LOOK HERE:  this variable is a result of this call-template
> > in fn_Concurrency.xsl and is the template which has trouble with the
> > MAX_DATE global -->
> >       <xsl:variable name="Group_B_Needs">
> >               <xsl:call-template name="get_needs2">
> >                       <xsl:with-param name="need_code_match"
> > select="$Group_B_Need_Codes" />
> >                       <xsl:with-param
> > name="SORTBYNEEDID">0</xsl:with-param>
> >               </xsl:call-template>
> >       </xsl:variable>
> >
> >       <xsl:template name="GradeAge">
> > <!-- LIST LOOK HERE:  entry template rule called from
> > validate_sped.xsl -->
> >
> > <!-- .. code removed .. -->
> >
> >               <!-- Rule: 3.1.17.5
> > [field[@fieldname='NeedCode']=$Group_B_Need_Codes/field[@field
> > name='NeedCode']]-->
> >       <xsl:element name="NOT_IMPLEMENTED">Complex rule -
> > 3.1.17.5: SPED
> > Grade UE &amp; Group B</xsl:element>
> >       <!-- skip if student doesn't not have a Grade of UE -->
> >       <xsl:variable name="recent_membership"
> > select="/root/recordset[@rsName='SchoolMemberships']/record[la
> > st()]/field[@fieldname='Id']"
> > />
> >       <xsl:if
> > test="/root/recordset[@rsName='Grades']/record[field[@fieldnam
> > e='SchoolMembershipID']=$recent_membership]/field[@fieldname='
> > RefGradeID']=
> > $UE_Grade_ID">
> >               <xsl:call-template name="SPEDUEorKG" />
> >       </xsl:if>
> >
> > <!-- .. code removed .. -->
> >
> >       </xsl:template>
> >
> >
> > <!-- .. code removed .. -->
> >
> >
> >
> > </xsl:stylesheet>
> > ========================================
> >
> > ..end of code
> >
> >
> >
> > On 5/11/05, Michael Kay <mike@xxxxxxxxxxxx> wrote:
> > > >
> > > > I could post actual code, it's a lot though.
> > >
> > > That's why I asked you to cut it down.
> > >
> > > Sometimes this not only makes it easier for other people to
> > find your
> > > problem, it makes it easier for you to find it too.
> > >
> > > Michael Kay
> > > http://www.saxonica.com/
> > >
> > > >
> > > > On 5/11/05, Michael Kay <mike@xxxxxxxxxxxx> wrote:
> > > > > Perhaps you could put together a simple 3-module example
> > > > that illustrates
> > > > > the problem.
> > > > >
> > > > > From what you've shown us, it looks as if the variable
> > > > should be in scope.
> > > > > Once we've seen and checked your code, the next question is
> > > > which processor
> > > > > you are using.
> > > > >
> > > > > Michael Kay
> > > > > http://www.saxonica.com/
> > > > >
> > > > > > -----Original Message-----
> > > > > > From: Karl Stubsjoen [mailto:kstubs@xxxxxxxxx]
> > > > > > Sent: 11 May 2005 17:38
> > > > > > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> > > > > > Subject: [xsl] Variable Scope
> > > > > >
> > > > > > Hello,
> > > > > >
> > > > > > So far I have not ran into any troubles with variable
> > > > scope, and I am
> > > > > > refering to globabl variable scope - variables defined
> > > > within my base
> > > > > > template.  I am having trouble now with a MAX_DATE
> > variable I have
> > > > > > defined.  So, I am wondering about execution plan and
> > where/when
> > > > > > variables are available.  Given the following
> > > > inclusiong/import plan I
> > > > > > will attempt to describe where it appears that
> > > > MAX_DATE(s) scope is
> > > > > > out-of-scope.
> > > > > >
> > > > > > base_template.xsl
> > > > > >   MAX_DATE is defined (see definition below)
> > > > > >
> > > > > > working_template_a.xsl
> > > > > >   {imports} base_template
> > > > > >   {includes} working_template_b.xsl
> > > > > >   {includes} working_template_c.xsl
> > > > > >   {includes} working_template_d.xsl
> > > > > >   {includes} ... additional working templates ..
> > > > > >
> > > > > > MAX_DATE inside of any template definition inside of any
> > > > included file
> > > > > > above is fine.  MAX_DATE used as part of a variable
> > > > definition at the
> > > > > > top (outside a template rule) of any of these include
> > > > files throws the
> > > > > > error:  "The variable or param MAX_DATE is either not
> > > > defined or it is
> > > > > > out of scope".
> > > > > >
> > > > > > Any ideas on this?
> > > > > >
> > > > > >
> > > > > > Note:  CreateNewDate template is defined in base_template.xsl
> > > > > > <xsl:variable name="MAX_DATE">
> > > > > > <xsl:call-template name="CreateNewDate">
> > > > > >   <xsl:with-param name="start_year" select="$FISCAL_YEAR" />
> > > > > >   <xsl:with-param name="start_month">06</xsl:with-param>
> > > > > >   <xsl:with-param name="start_day">30</xsl:with-param>
> > > > > > </xsl:call-template>
> > > > > > </xsl:variable>

Current Thread