Re: [xsl] Variable Scope

Subject: Re: [xsl] Variable Scope
From: Karl Stubsjoen <kstubs@xxxxxxxxx>
Date: Tue, 17 May 2005 09:53:57 -0700
Update!
I am parsing with MSXML using the msxsl command interface and I do not
run into the scope error.  When I use my DOTNET transformation tool
(simple C# console app which uses the .net xml libraries) the error
appears.
If you can offer any input on this great.  Does anyone know if the
.net xml parser is the same as the standard msxml 4 library?

Karl..


On 5/17/05, Karl Stubsjoen <kstubs@xxxxxxxxx> wrote:
> 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