xsl-list
[Top] [All Lists]

Re: Variable Scope

2005-05-17 09:36:51
The exact error is:

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


On 5/12/05, Michael Kay <mike(_at_)saxonica(_dot_)com> 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(_at_)gmail(_dot_)com]
Sent: 11 May 2005 21:12
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
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[(_at_)rsName='Counties']/record[fiel
d[(_at_)fieldname='regular-az-county']
= '1']" />
      <xsl:variable name="PUBLIC_REFTYPES"
select="$sd_lookups//recordset[(_at_)rsName='RefTypes']/record[fiel
d[(_at_)fieldname='DOR-Type']='PUBLIC']/field[(_at_)fieldname='RefTypeID']"/>
      <xsl:variable name="CHARTER_REFTYPES"
select="$sd_lookups//recordset[(_at_)rsName='RefTypes']/record[fiel
d[(_at_)fieldname='DOR-Type']='CHARTER']/field[(_at_)fieldname='RefTypeID']"/>
      <xsl:variable name="NEEDS"
select="$sd_lookups//recordset[(_at_)rsName='NeedCodes']/record/fie
ld[(_at_)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[(_at_)rsName='EntityOwnerInfo']/record/field
[(_at_)fieldname='RefTypeID']"
/>
      <xsl:variable name="DOA_ENTITYID"
select="root/recordset[(_at_)rsName='EntityOwnerInfo']/record/field
[(_at_)fieldname='EntityID']"
/>
      <xsl:variable name="DOA_CTDS"
select="root/recordset[(_at_)rsName='EntityOwnerInfo']/record/field
[(_at_)fieldname='CTDS']"
/>
      <xsl:variable name="DOA_COUNTY"
select="root/recordset[(_at_)rsName='EntityOwnerInfo']/record/field
[(_at_)fieldname='RefCountyID']"
/>

      <!-- ENTITY -->
      <xsl:variable name="ENTITY_NATURE"
select="root/recordset[(_at_)rsName='EntityInfo']/record/field[(_at_)fie
ldname='Nature']"
/>
      <xsl:variable name="ENTITY_REFTYPE"
select="root/recordset[(_at_)rsName='EntityInfo']/record/field[(_at_)fie
ldname='RefTypeID']"
/>
      <xsl:variable name="ENTITY_ENTITYID"
select="root/recordset[(_at_)rsName='EntityInfo']/record/field[(_at_)fie
ldname='EntityID']"
/>
      <xsl:variable name="ENTITY_CTDS"
select="root/recordset[(_at_)rsName='EntityInfo']/record/field[(_at_)fie
ldname='CTDS']"
/>
      <xsl:variable name="ENTITY_COUNTY"
select="root/recordset[(_at_)rsName='EntityInfo']/record/field[(_at_)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[(_at_)rsName='RefTypes']/record[fiel
d[(_at_)fieldname='validates-GradeDOR']='1']/field[(_at_)fieldname='RefTypeID']"
/>
      <xsl:variable name="SPEDDor"
select="/root/recordset[(_at_)rsName='SPEDDor']/record[field[(_at_)field
name='ResidenceRefTypeID'
and not(.= $DORExceptions)]]" />
      <xsl:variable name="AllowedGradeID"
select="$sd_lookups//recordset[(_at_)rsName='GradeLookup']/record[f
ield[(_at_)fieldname='Grade'
and (.= 'KG' or .= 'PS' or .= 'UE')]]/field[(_at_)fieldname='GradeID']" />
      <xsl:variable name="UE_Grade_ID"
select="$sd_lookups//recordset[(_at_)rsName='GradeLookup']/record[f
ield[(_at_)fieldname='Grade']
= 'UE']/field[(_at_)fieldname='GradeID']" />
      <xsl:variable name="PS_Grade_ID"
select="$sd_lookups//recordset[(_at_)rsName='GradeLookup']/record[f
ield[(_at_)fieldname='Grade']
= 'PS']/field[(_at_)fieldname='GradeID']" />
      <xsl:variable name="Group_B_Need_Codes"
select="$sd_lookups//recordset[(_at_)rsName='NeedCodes']/record[fie
ld[(_at_)fieldname='validates-GradeAge']='1']/field[(_at_)fieldname='NeedCode']"
/>
      <xsl:variable name="KG_Grade_ID"
select="$sd_lookups//recordset[(_at_)rsName='GradeLookup']/record[f
ield[(_at_)fieldname='Grade']
= 'KG']/field[(_at_)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[(_at_)fieldname='NeedCode']=$Group_B_Need_Codes/field[(_at_)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[(_at_)rsName='SchoolMemberships']/record[la
st()]/field[(_at_)fieldname='Id']"
/>
      <xsl:if
test="/root/recordset[(_at_)rsName='Grades']/record[field[(_at_)fieldnam
e='SchoolMembershipID']=$recent_membership]/field[(_at_)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(_at_)saxonica(_dot_)com> 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(_at_)saxonica(_dot_)com> 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(_at_)gmail(_dot_)com]
Sent: 11 May 2005 17:38
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
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>



--~------------------------------------------------------------------
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>
--~--





--~------------------------------------------------------------------
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>
--~--




--~------------------------------------------------------------------
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>
--~--




--~------------------------------------------------------------------
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>
--~--



--~------------------------------------------------------------------
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>
--~--



--~------------------------------------------------------------------
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>
--~--



--~------------------------------------------------------------------
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>