source: main/trunk/ibisph-view/src/main/webapp/xslt/xml/ComparisonValues.xslt @ 19691

Last change on this file since 19691 was 19691, checked in by GarthBraithwaite_STG, 3 years ago

admin, view, java - temp commit - css grid and color updates. white topic icons all resized consistently. Latest jquery. Fixed conatain typo in xslt. MenuSelectionsList? docs and refactoring. interactive to handle view dim values sort order. site nav div to nav. Included SORT_ORDER into the view's dim VALUE struct.

File size: 30.9 KB
Line 
1<?xml version="1.0" encoding="ISO-8859-1"?>
2
3<xsl:stylesheet version="3.0" 
4        xmlns:xsl ="http://www.w3.org/1999/XSL/Transform" 
5        xmlns:xs  ="http://www.w3.org/2001/XMLSchema"
6        xmlns:ibis="http://www.ibisph.org"
7
8        exclude-result-prefixes="ibis xs xsl"
9>
10
11        <ibis:doc>
12                <name>xml/ComparisonValues</name>
13                <summary>Provides XML element creation used community type pages.</summary>
14                <description>
15                        The bulk of this code is to produce the comparison XML structure.
16                        NOTE: This code is business rules and logic and thus really should
17                        be put into java code.  However, doing so makes it more difficult
18                        for Lois/Paul to maintain or for other adopters to modify the rules
19                        so it was coded in XSLT.
20                </description>
21        </ibis:doc>
22
23
24        <xsl:param name="ComparisonValues.defaultNumberOfGroups" select="3"/>
25
26        <xsl:param name="ComparisonValues.stateDimensionName"  select="'State'"/>
27        <xsl:param name="ComparisonValues.stateDimensionValue" select="'NM'"/>
28        <xsl:param name="ComparisonValues.usDimensionName"     select="'Country'"/>
29        <xsl:param name="ComparisonValues.usDimensionValue"    select="'US'"/>
30        <xsl:param name="ComparisonValues.lowerLimitAncillaryValueName" select="'LowerConfidenceLimit'"/>
31        <xsl:param name="ComparisonValues.upperLimitAncillaryValueName" select="'UpperConfidenceLimit'"/>
32
33        <xsl:param name="ComparisonValues.yearPeriodDimensionName"     select="'Year'"/>
34        <xsl:param name="ComparisonValues.defaultPeriodDimensionName"  select="'YearDefault'"/>
35        <xsl:param name="ComparisonValues.defaultPeriodDimensionValue" select="'unspecified'"/>
36
37
38<!-- GARTH TODO: remove or update as needed.
39        <DATASETS>
40                <DATASET name="CancerDeathLung.CancerDeathsPer100K">
41                        <NAME>CancerDeathLung.CancerDeathsPer100K</NAME>
42
43                        <VALUE_TYPES>
44                                <VALUE_TYPE name="RatePer100K">
45                        <MEASURE_NAME>CancerDeathsPer100K</MEASURE_NAME>
46                        <MEASURE>
47                                ...
48                        <DIMENSION_COMBINATIONS>
49                                <DIMENSION_COMBINATION>
50                                        <PERIOD_DIMENSION>
51                                                <NAME>Year</NAME>
52                                                <VALUES>
53                                                        <VALUE>2012</VALUE>
54                                                                . . .
55                                                        <VALUE>1988</VALUE>
56                                                </VALUES>
57                                        </PERIOD_DIMENSION>
58                                        <DIMENSION_1>
59                                                <NAME>US</NAME>
60                                        </DIMENSION_1>
61                                </DIMENSION_COMBINATION>
62                        </DIMENSION_COMBINATIONS>
63Generic USAGES struct doesn't work as they need to be contained as a group
64                        <DIMENSION_USAGES>
65                                <DIMENSION_USAGE>
66                                        <USAGE>period</USAGE>
67                                        <NAME>Year</NAME>
68                                        <VALUES>
69                                                <VALUE>2012</VALUE>
70                                                        . . .
71                                                <VALUE>1988</VALUE>
72                                        </VALUES>
73                                </DIMENSION_USAGE>
74                                <DIMENSION_USAGE>
75                                        <USAGE>dimension_1</USAGE>
76                                        <NAME>US</NAME>
77                                </DIMENSION_USAGE>
78                        </DIMENSION_USAGES>
79
80IP HAS:
81
82
83maybe simply start with the IP datasets that have the community name/value only combination.  ==> COMMUN DATASETS
84                            IP datasets that have the US only combination.  ==> US DATASETS
85
86Get COM and US datasets that of all NON combined years.
87
88Get the US dataset that has period and dim
89
90Get the measure of the US dataset.
91Get the period that is NOT the all combined.
92If not exists then get the first non all combined dimension
93
94
95The request can specify the dims to ComparisonValues.  If nothing the XSLT can have default state and US.
96The XSLT can then determine the primary dataset by matching the DIM COMBO
97of community dim/value with period name/value and measure.
98
99 the main dimension 1 name and value are on the request URL
100        the state ds is the same as the primary.  The state dim name and value are
101        hard coded values - like the US dim name and value.
102       
103        The period name and value MUST match across all compare datasets.
104       
105        Maybe reference a IP VIEW.  The IP view specifies:
106        - Primary and any other dataset(s).  Primary is the one that contains the
107          specified community dim name/value.  All others are comparisons.  However,
108          how do determine which dim name and value to use on those other datasets?
109          US and STATE can be hard coded.  Others???  Maybe the XSLT has a list of
110          DIM NAME/VALUE to be tried???
111        - Measure
112        - Period dim name
113       
114        ********** PROBLEM WITH IP VIEW: views rarely contains everything needed.
115        The state us is typically by year and does NOT include any other community
116        dims.  Once in a while you'll get State, Community, US by Sex with all years
117        held constant etc.
118-->
119        <xsl:template name="ComparisonValues.getIndicatorStateUSComparisonValues"
120                ibis:doc="Contains the logic to determine which IP datasets and their
121                        assoc measures/AV values.  These values are then put inside an XML
122                        struct and returned for consumption.
123
124                        PERIOD_DIMENSION
125                                NAME   (dimension)
126                                TITLE  (dimension)
127                                VALUE  (dimension value)
128                        COMMUNITY
129                                TITLE (dimension)
130                                VALUE (measure)
131                                        text value
132                                        TITLE
133                                LOWER_LIMIT
134                                        text value
135                                        TITLE
136                                UPPER_LIMIT
137                                        text value
138                                        TITLE
139                                DESIRABLE_VALUE (measure)
140                                RELIABILITY  ComparisonValues.statisticalReliability(communityRecord/MEASURE/VALUE, lowerLimit, upperLimit)
141                        STATE
142                                TITLE (dimension)
143                                VALUE
144                                        text value
145                                        TITLE
146                                        COMPARISON
147                                                CLASS ComparisonValues.comparisonClass(communityMeasureValue, communityLL, communityUL, stateMeasureValue, measureDesirableValue)
148                                                GAUGE_NAME ComparisonValues.gaugeName(stateComparisonClass, measureDesirableValue)
149                        US - same as STATE
150                "
151        >
152                <xsl:param name="indicator"/>
153                <xsl:param name="dimensions"/>
154                <xsl:param name="measures"/>
155                <xsl:param name="valueTypes"/>
156
157                <xsl:param name="communityDimensionName"/>
158                <xsl:param name="communityDimensionValue"/>
159                <xsl:param name="stateDimensionName"      select="$ComparisonValues.stateDimensionName"/>
160                <xsl:param name="stateDimensionValue"     select="$ComparisonValues.stateDimensionValue"/>
161                <xsl:param name="usDimensionName"         select="$ComparisonValues.usDimensionName"/>
162                <xsl:param name="usDimensionValue"        select="$ComparisonValues.usDimensionValue"/>
163
164                <xsl:param name="dimension2Name"/>
165                <xsl:param name="dimension2Value"/>
166
167                <xsl:param name="periodDimensionName"/>
168                <xsl:param name="periodDimensionValue"/>
169
170                <xsl:param name="measureName"/>
171
172
173                <!-- usDS = DATASETs based on DS DIM COMBO - If DIM2 then use else US DIM1, NO DIM 2.
174                        usPeriodDimensionCombinations = all the period dim combos from the usDS
175                        usMeasureNames = all the measure names from the usDS
176                -->
177                <xsl:variable name="usDatasets" select="
178                        if(0 = string-length($dimension2Name)) then
179                                $indicator/DATASETS/DATASET[DIMENSION_COMBINATIONS/DIMENSION_COMBINATION[not(DIMENSION_2/NAME) and DIMENSION_1/NAME = $usDimensionName]]
180                        else
181                                $indicator/DATASETS/DATASET[DIMENSION_COMBINATIONS/DIMENSION_COMBINATION[(DIMENSION_2/NAME = $dimension2Name) and DIMENSION_1/NAME = $usDimensionName]]
182                "/>
183                <xsl:variable name="usPeriodDimensionCombinations" select="
184                        if(0 = string-length($dimension2Name)) then
185                                $usDatasets/DIMENSION_COMBINATIONS/DIMENSION_COMBINATION[not(DIMENSION_2/NAME) and DIMENSION_1/NAME = $usDimensionName]/PERIOD_DIMENSION
186                        else
187                                $usDatasets/DIMENSION_COMBINATIONS/DIMENSION_COMBINATION[(DIMENSION_2/NAME = $dimension2Name) and DIMENSION_1/NAME = $usDimensionName]/PERIOD_DIMENSION
188                "/>
189                <xsl:variable name="usMeasureNames" select="$usDatasets/MEASURE_NAME"/>
190
191
192                <!-- do a similar thing for the community Datasets.  If US measures match
193                        community measures then limit the Community Measure Names to those
194                        that match the US measures else simply use the community measure names.
195                        NOTE: community and state are in the same dataset.
196                -->
197                <xsl:variable name="communityDatasets" select="
198                        if(0 = string-length($dimension2Name)) then
199                                $indicator/DATASETS/DATASET[DIMENSION_COMBINATIONS/DIMENSION_COMBINATION[not(DIMENSION_2/NAME) and DIMENSION_1/NAME = $communityDimensionName]]
200                        else
201                                $indicator/DATASETS/DATASET[DIMENSION_COMBINATIONS/DIMENSION_COMBINATION[(DIMENSION_2/NAME = $dimension2Name) and (DIMENSION_1/NAME = $communityDimensionName)]]
202                "/>
203                <xsl:variable name="communityPeriodDimensionCombinations" select="
204                        if(0 = string-length($dimension2Name)) then
205                                $communityDatasets/DIMENSION_COMBINATIONS/DIMENSION_COMBINATION[not(DIMENSION_2/NAME) and DIMENSION_1/NAME = $communityDimensionName]/PERIOD_DIMENSION
206                        else
207                                $communityDatasets/DIMENSION_COMBINATIONS/DIMENSION_COMBINATION[(DIMENSION_2/NAME = $dimension2Name) and DIMENSION_1/NAME = $communityDimensionName]/PERIOD_DIMENSION
208                "/>
209                <xsl:variable name="communityMeasureNames" select="
210                        if(0 != count($communityDatasets[MEASURE_NAME = $usMeasureNames]/MEASURE_NAME )) then
211                                $communityDatasets[MEASURE_NAME = $usMeasureNames]/MEASURE_NAME
212                        else
213                                $communityDatasets/MEASURE_NAME
214                "/>
215
216
217                <!-- Determine the period name if not passed in. 
218                        RULES:
219                        - If passed as a param then use that.
220                        - Else if both US and Community have "Year" then use "Year".
221                        - Else If US Period Dim and not default and US matches Community Period Dim use first match.
222                        - Else get the first US Period Dim that matches a community period dim (typically theis will be the default/all years).
223                        - Else community only - try the "Year" with the dim2.
224                        - Else community only - try the "Year" without dim2.
225                        - Else use the default combined.  Could have done several other checks
226                                like getting the first non default
227                               
228                        - All combined
229                        -
230                -->
231                <xsl:variable name="periodName">
232                        <xsl:choose>
233                                <xsl:when test="0 != string-length($periodDimensionName)">
234                                        <xsl:value-of select="$periodDimensionName"/>
235                                </xsl:when>
236
237                                <xsl:when test="
238                                        exists($usPeriodDimensionCombinations[NAME = $ComparisonValues.yearPeriodDimensionName])
239                                        and
240                                        exists($communityPeriodDimensionCombinations[NAME = $ComparisonValues.yearPeriodDimensionName])
241                                ">
242                                        <xsl:value-of select="$ComparisonValues.yearPeriodDimensionName"/>
243                                </xsl:when>
244                                <xsl:when test="exists($usPeriodDimensionCombinations[(NAME != $ComparisonValues.defaultPeriodDimensionName) and (NAME = $communityPeriodDimensionCombinations/NAME)]/NAME)">
245                                        <xsl:value-of select="($usPeriodDimensionCombinations[(NAME != $ComparisonValues.defaultPeriodDimensionName) and (NAME = $communityPeriodDimensionCombinations/NAME)]/NAME)[1]"/>
246                                </xsl:when>
247                                <xsl:when test="exists($usPeriodDimensionCombinations[NAME = $communityPeriodDimensionCombinations]/NAME)">
248                                        <xsl:value-of select="($usPeriodDimensionCombinations[NAME = $communityPeriodDimensionCombinations/NAME]/NAME)[1]"/>
249                                </xsl:when>
250
251                                <xsl:when test="exists($communityPeriodDimensionCombinations[NAME != $ComparisonValues.defaultPeriodDimensionName]/NAME)">
252                                        <xsl:value-of select="($communityPeriodDimensionCombinations[NAME != $ComparisonValues.defaultPeriodDimensionName]/NAME)[1]"/>
253                                </xsl:when>
254                                <xsl:otherwise>
255                                        <xsl:value-of select="$ComparisonValues.defaultPeriodDimensionName"/>
256                                </xsl:otherwise>
257                        </xsl:choose>
258                </xsl:variable>
259
260                <xsl:variable name="measureName" select="
261                        if(0 != string-length($measureName)) then $measureName
262                        else $communityDatasets[(MEASURE_NAME = $communityMeasureNames) and DIMENSION_COMBINATIONS/DIMENSION_COMBINATION[PERIOD_DIMENSION/NAME = $periodName]][1]/MEASURE_NAME
263                "/>
264<xsl:message select="concat('ComparisonValues.getIndicatorStateUSComparisonValues - count of measure names: ', count($measureName))"/>
265                <xsl:variable name="usDataset"        select="$usDatasets       [(MEASURE_NAME = $measureName) and DIMENSION_COMBINATIONS/DIMENSION_COMBINATION[PERIOD_DIMENSION/NAME = $periodName]]"/>
266                <xsl:variable name="communityDataset" select="$communityDatasets[(MEASURE_NAME = $measureName) and DIMENSION_COMBINATIONS/DIMENSION_COMBINATION[PERIOD_DIMENSION/NAME = $periodName]]"/>
267
268                <xsl:variable name="periodValue">
269                        <xsl:choose>
270                                <xsl:when test="0 != string-length($periodDimensionValue)">
271                                        <xsl:value-of select="$periodDimensionValue"/>
272                                </xsl:when>
273                                <xsl:otherwise>
274                                        <xsl:variable name="periodValues">
275                                                <xsl:for-each select="distinct-values( $communityDataset/DIMENSION_COMBINATIONS/DIMENSION_COMBINATION/PERIOD_DIMENSION[NAME = $periodName]/VALUES/VALUE )">
276                                                        <xsl:sort select="." data-type="text" order="descending"/>
277                                                        <VALUE><xsl:value-of select="."/></VALUE>
278                                                </xsl:for-each>
279                                        </xsl:variable>
280                                        <xsl:value-of select="
281                                                if(string-length($periodValues/VALUE[1]) != 0) then
282                                                        $periodValues/VALUE[1]
283                                                else if($periodName = $ComparisonValues.defaultPeriodDimensionName) then
284                                                        $ComparisonValues.defaultPeriodDimensionValue
285                                                else
286                                                        ''
287                                        "/>
288<xsl:message select="'-----------------ComparisonValues.getIndicatorStateUSComparisonValueElements - periodValues: '"/>
289<xsl:message select="$periodValues/VALUE"/>
290                                </xsl:otherwise>
291                        </xsl:choose>
292                </xsl:variable>
293<xsl:message select="concat('-----------------ComparisonValues.getIndicatorStateUSComparisonValueElements - periodValue: ', $periodValue, ', measureName: ', $measureName)"/>
294
295
296                <xsl:variable name="communityRecord" select="
297                        if(0 = string-length($dimension2Name)) then
298                                $communityDataset/RECORDS/RECORD[ DIMENSIONS[ (2 = count(DIMENSION)) and DIMENSION[(NAME = $communityDimensionName) and (VALUE = $communityDimensionValue)] and DIMENSION[(NAME = $periodName) and (VALUE = $periodValue)]]]
299                        else
300                                $communityDataset/RECORDS/RECORD[ DIMENSIONS[ DIMENSION[(NAME = $communityDimensionName) and (VALUE = $communityDimensionValue)]  and  DIMENSION[(NAME = $dimension2Name) and (VALUE = $dimension2Value)]  and  DIMENSION[(NAME = $periodName) and (VALUE = $periodValue)]]]
301                "/>
302                <xsl:variable name="stateRecord" select="
303                        if(0 = string-length($dimension2Name)) then
304                                $communityDataset/RECORDS/RECORD[ DIMENSIONS[ (2 = count(DIMENSION)) and DIMENSION[(NAME = $stateDimensionName) and (VALUE = $stateDimensionValue)]  and  DIMENSION[(NAME = $periodName) and (VALUE = $periodValue)]]]
305                        else
306                                $communityDataset/RECORDS/RECORD[ DIMENSIONS[ DIMENSION[(NAME = $stateDimensionName) and (VALUE = $stateDimensionValue)]  and  DIMENSION[(NAME = $dimension2Name) and (VALUE = $dimension2Value)]  and  DIMENSION[(NAME = $periodName) and (VALUE = $periodValue)]]]
307                "/>
308                <xsl:variable name="usRecord" select="
309                        if(0 = string-length($dimension2Name)) then
310                                $usDataset/RECORDS/RECORD[ DIMENSIONS[ (2 = count(DIMENSION)) and DIMENSION[(NAME = $usDimensionName)  and  (VALUE = $usDimensionValue)]  and  DIMENSION[(NAME = $periodName) and (VALUE = $periodValue)]]]
311                        else
312                                $usDataset/RECORDS/RECORD[ DIMENSIONS[ DIMENSION[(NAME = $usDimensionName) and (VALUE = $usDimensionValue)]  and  DIMENSION[(NAME = $dimension2Name) and (VALUE = $dimension2Value)]  and  DIMENSION[(NAME = $periodName) and (VALUE = $periodValue)]]]
313                "/>
314
315                <xsl:variable name="measure"    select="$measures//MEASURE[NAME = $measureName]"/>
316                <xsl:variable name="lowerLimit" select="$communityRecord/ANCILLARY_VALUES/ANCILLARY_VALUE[NAME = $ComparisonValues.lowerLimitAncillaryValueName]/VALUE"/>
317                <xsl:variable name="upperLimit" select="$communityRecord/ANCILLARY_VALUES/ANCILLARY_VALUE[NAME = $ComparisonValues.upperLimitAncillaryValueName]/VALUE"/>
318                <xsl:variable name="formatPattern" select="$valueTypes/VALUE_TYPE[NAME = $measure/VALUE_TYPE_NAME]/XSLT_FORMAT_PATTERN"/>
319<!-- GARTH TODO: remove
320                <xsl:variable name="formatPattern" select="'0.0'"/>
321               
322<xsl:if test="count($usRecord/MEASURE) &gt; 1">
323<xsl:message select="$indicatorName"/>
324<xsl:message select="$measureName"/>
325<xsl:message select="$usRecord"/>
326</xsl:if>
327<xsl:if test="count($indicator/NAME) = 'SuicDeath'">
328<xsl:message select="$indicator/NAME"/>
329<xsl:message select="$periodName"/>
330<xsl:message select="$periodValue"/>
331<xsl:message select="$measure"/>
332</xsl:if>
333
334<xsl:if test="$indicator/NAME = 'SuicDeath'">
335<xsl:message select="$indicator/NAME"/>
336<xsl:message select="$periodName"/>
337<xsl:message select="$periodValue"/>
338<xsl:message select="$communityRecord"/>
339</xsl:if>
340
341<xsl:if test="$indicator/NAME = 'NutriAdultFruitVeg'">
342<xsl:message select="'********** ComparisonValues.getIndicatorStateUSComparisonValueElements: NutriAdultFruitVeg Measure Name and DV'"/>
343<xsl:message select="$usDatasets"/>
344<xsl:message select="$usMeasureNames"/>
345<xsl:message select="$communityMeasureNames"/>
346<xsl:message select="$periodName"/>
347<xsl:message select="$periodValue"/>
348<xsl:message select="$measure"/>
349</xsl:if>
350
351<xsl:message select="'garth'"/>
352<xsl:message select="$usRecord"/>
353
354
355<xsl:message select="'xxxxxxxxxxxxxxxxxxxxxxxx communityRecord: '"/>
356<xsl:message select="$communityRecord"/>
357<xsl:message select="$measureName"/>
358<xsl:message select="'xxxxxxxxxxxxxxxxxxxxxxxx end'"/>
359
360<xsl:if test="count($stateRecord/MEASURE/VALUE) &gt; 1">
361        <xsl:message select="'xxxxxxxxxxxxxxxxxxxxxxxx start of dup STATE record: '"/>
362        <xsl:message select="$indicator/NAME"/>
363        <xsl:message select="$communityDataset/NAME"/>
364        <xsl:message select="$stateRecord"/>
365        <xsl:message select="'xxxxxxxxxxxxxxxxxxxxxxxx end'"/>
366</xsl:if>
367<xsl:if test="count($usRecord/MEASURE/VALUE) &gt; 1">
368        <xsl:message select="'xxxxxxxxxxxxxxxxxxxxxxxx start of dup US comparison record: '"/>
369        <xsl:message select="$indicator/NAME"/>
370        <xsl:message select="$usDataset/NAME"/>
371        <xsl:message select="$usRecord"/>
372        <xsl:message select="'xxxxxxxxxxxxxxxxxxxxxxxx end'"/>
373</xsl:if>
374-->
375
376                <xsl:if test="count($communityRecord/*) != 0">
377                        <PERIOD_DIMENSION>
378                                <NAME><xsl:value-of select="$periodName"/></NAME>
379                                <xsl:copy-of select="$communityDataset//DIMENSION[NAME=$periodName]/TITLE"/>
380                                <xsl:copy-of select="$dimensions//DIMENSION[NAME=$periodName]/VALUES/VALUE[normalize-space(text()[1]) = $periodValue]"/>
381                        </PERIOD_DIMENSION>
382                        <COMMUNITY>
383                                <xsl:copy-of select="$dimensions/DIMENSIONS/DIMENSION[NAME = $communityDimensionName]/VALUES/VALUE[normalize-space(text()[1]) = $communityDimensionValue]/TITLE"/>
384                                <VALUE>
385                                        <xsl:value-of select="$communityRecord/MEASURE/VALUE"/>
386                                        <TITLE><xsl:value-of select="ibis:getFormattedNumber($communityRecord/MEASURE/VALUE, $formatPattern)"/></TITLE>
387                                </VALUE>
388                                <LOWER_LIMIT>
389                                        <xsl:value-of select="$lowerLimit"/>
390                                        <TITLE><xsl:value-of select="ibis:getFormattedNumber($lowerLimit, $formatPattern)"/></TITLE>
391                                </LOWER_LIMIT>
392                                <UPPER_LIMIT>
393                                        <xsl:value-of select="$upperLimit"/>
394                                        <TITLE><xsl:value-of select="ibis:getFormattedNumber($upperLimit, $formatPattern)"/></TITLE>
395                                </UPPER_LIMIT>
396                                <xsl:copy-of select="$measure/DESIRABLE_VALUE"/>
397                                <RELIABILITY>
398                                        <xsl:call-template name="ComparisonValues.statisticalReliability">
399                                                <xsl:with-param name="measure" select="$communityRecord/MEASURE/VALUE"/>
400                                                <xsl:with-param name="measureLowerLimit" select="$lowerLimit"/>
401                                                <xsl:with-param name="measureUpperLimit" select="$upperLimit"/>
402                                        </xsl:call-template>
403                                </RELIABILITY>
404                        </COMMUNITY>
405                        <STATE>
406                                <xsl:copy-of select="$dimensions/DIMENSIONS/DIMENSION[NAME = $stateDimensionName]/VALUES/VALUE[normalize-space(text()[1]) = $stateDimensionValue]/TITLE"/>
407                                <VALUE>
408                                        <xsl:value-of select="$stateRecord[1]/MEASURE/VALUE"/>
409                                        <TITLE><xsl:value-of select="ibis:getFormattedNumber($stateRecord[1]/MEASURE/VALUE, $formatPattern)"/></TITLE>
410                                        <xsl:variable name="stateComparisonClass">
411                                                <xsl:call-template name="ComparisonValues.comparisonClass">
412                                                        <xsl:with-param name="measureValue"      select="$communityRecord/MEASURE/VALUE"/>
413                                                        <xsl:with-param name="measureLowerLimit" select="$lowerLimit"/>
414                                                        <xsl:with-param name="measureUpperLimit" select="$upperLimit"/>
415                                                        <xsl:with-param name="comparativeValue"  select="$stateRecord[1]/MEASURE/VALUE"/>
416                                                        <xsl:with-param name="desirableValue"    select="$measure/DESIRABLE_VALUE"/>
417                                                </xsl:call-template>   
418                                        </xsl:variable>
419                                        <COMPARISON>
420                                                <CLASS><xsl:value-of select="$stateComparisonClass"/></CLASS>
421                                                <GAUGE_NAME>
422                                                        <xsl:call-template name="ComparisonValues.gaugeName">
423                                                                <xsl:with-param name="comparisonClass" select="$stateComparisonClass"/>
424                                                                <xsl:with-param name="desirableValue"  select="$measure/DESIRABLE_VALUE"/>
425                                                        </xsl:call-template>   
426                                                </GAUGE_NAME>
427                                        </COMPARISON>
428                                </VALUE>
429                        </STATE>
430                        <US>
431                                <xsl:copy-of select="$dimensions/DIMENSIONS/DIMENSION[NAME = $usDimensionName]/VALUES/VALUE[normalize-space(text()[1]) = $usDimensionValue]/TITLE"/>
432                                <VALUE>
433                                        <xsl:value-of select="$usRecord[1]/MEASURE/VALUE"/>
434                                        <TITLE><xsl:value-of select="ibis:getFormattedNumber($usRecord[1]/MEASURE/VALUE, $formatPattern)"/></TITLE>
435                                        <xsl:variable name="usComparisonClass">
436                                                <xsl:call-template name="ComparisonValues.comparisonClass">
437                                                        <xsl:with-param name="measureValue"      select="$communityRecord/MEASURE/VALUE"/>
438                                                        <xsl:with-param name="measureLowerLimit" select="$lowerLimit"/>
439                                                        <xsl:with-param name="measureUpperLimit" select="$upperLimit"/>
440                                                        <xsl:with-param name="comparativeValue"  select="$usRecord[1]/MEASURE/VALUE"/>
441                                                        <xsl:with-param name="desirableValue"    select="$measure/DESIRABLE_VALUE"/>
442                                                </xsl:call-template>   
443                                        </xsl:variable>
444                                        <COMPARISON>
445                                                <CLASS><xsl:value-of select="$usComparisonClass"/></CLASS>
446                                                <GAUGE_NAME>
447                                                        <xsl:call-template name="ComparisonValues.gaugeName">
448                                                                <xsl:with-param name="comparisonClass" select="$usComparisonClass"/>
449                                                                <xsl:with-param name="desirableValue"  select="$measure/DESIRABLE_VALUE"/>
450                                                        </xsl:call-template>   
451                                                </GAUGE_NAME>
452                                        </COMPARISON>
453                                </VALUE>
454                        </US>
455                        <xsl:copy-of select="$measure"/>
456                </xsl:if>
457        </xsl:template>
458
459
460        <xsl:template name="ComparisonValues.statisticalReliability" 
461                ibis:doc="Localizes logic needed to determine the approp reliability flag
462                        measure with 0=RSE lt .3, 1=RSE between .30 - .50, 2=RSE gt .50."
463        >
464                <xsl:param name="measure"/>
465                <xsl:param name="measureLowerLimit"/>
466                <xsl:param name="measureUpperLimit"/>
467<!-- GARTH TODO: REMOVE -->
468<xsl:message select="$measure"/>
469                <!--first off, check for for instances when when the community dimension
470                        is not present - such as indicators that use selected counties, then
471                        check for when the indicator value is missing or '**'
472                        Can also use: string(number($number))='NaN'
473                -->
474                <xsl:choose>
475                        <xsl:when test="(string(number($measure)) = 'NaN')
476                                or ($measureLowerLimit = 'DNA')
477                                or ($measureUpperLimit = 'DNA')
478                        ">DNA</xsl:when>
479
480                        <xsl:otherwise>
481                                <xsl:variable name="rse">
482                                        <xsl:call-template name="ComparisonValues.rse">
483                                                <xsl:with-param name="measure"            select="number($measure)"/>
484                                                <xsl:with-param name="measureLowerLimit"  select="number($measureLowerLimit)"/>
485                                                <xsl:with-param name="measureUpperLimit"  select="number($measureUpperLimit)"/>
486                                        </xsl:call-template>
487                                </xsl:variable>
488
489                                <xsl:choose>
490                                        <xsl:when test="number($rse) &lt; 0.3">Stable</xsl:when>
491                                        <xsl:when test="number($rse) &gt; 0.5">Very Unstable</xsl:when>
492                                        <xsl:otherwise>Unstable</xsl:otherwise>
493                                </xsl:choose>
494                        </xsl:otherwise>
495                </xsl:choose>
496        </xsl:template>
497
498
499        <xsl:template name="ComparisonValues.rse" 
500                ibis:doc="Localizes the calc logic used to determine the reliability.
501                        This value *could* be determined at the time of publishing the
502                        dataset XML.
503                "
504        >
505                <xsl:param name="measure"/>
506                <xsl:param name="measureLowerLimit"/>
507                <xsl:param name="measureUpperLimit"/>
508
509                <xsl:param name="lowerDifference" select="$measure - $measureLowerLimit"/>
510                <xsl:param name="upperDifference" select="$measureUpperLimit - $measure"/>
511                <xsl:param name="difference"      select="if($lowerDifference &gt; $upperDifference)then $lowerDifference else $upperDifference"/>
512                <xsl:value-of select="($difference div 1.96) div $measure"/>
513        </xsl:template>
514
515
516        <!-- G A U G E   G R A P H I C   a n d   C L A S S I F I C A T I O N -->
517        <xsl:template name="ComparisonValues.comparisonClass" 
518                ibis:doc="Localizes logic needed to determine the approp comparison
519                        classification/css class. This call is typically used to determine
520                        the css class for the comparison cell color.
521
522                        Note this template  ONLY handles numeric values - it does NOT deal
523                        with values which contain character type data.
524
525                        Value returned: Worse, Below, Similar, Above, Better, ''.
526
527                        Low target value:
528                        Better - EXCELLENT: UCL lt Compare Value
529                        Above - REASON FOR CONCERN: LCL gt Compare Value
530                        Similar - SAME: when none of the above and number groups = 3
531                        Below - WATCH: Value le Compare Value
532                        Worse - IMPROVEMENT NEEDED: Value ge Compare Value
533
534                        High target value:
535                        Better - EXCELLENT: LCL gt Compare Value
536                        Above - REASON FOR CONCERN: UCL lt Compare Value
537                        Similar - SAME: when none of the above and number groups = 3
538                        Below - WATCH: Value ge Compare Value
539                        Worse - IMPROVEMENT NEEDED: Value le Compare Value
540                "
541        >
542                <xsl:param name="measureValue"/>
543                <xsl:param name="measureLowerLimit"/>
544                <xsl:param name="measureUpperLimit"/>
545                <xsl:param name="comparativeValue"/>
546                <xsl:param name="desirableValue"
547                        ibis:doc="This is the measureValue/DESIRABLE_VALUE.  The current usage
548                                is an index where 0=low is better and + means high is better.
549                                The measureValue's DV is numeric to be flexible for future uses -
550                                e.g. so that actual numeric target type values can be used. 
551                        "
552                />
553                <xsl:param name="numberOfGroups" select="$ComparisonValues.defaultNumberOfGroups"/>
554
555                <!-- convert to numeric as XSLT defaults to string values -->
556                <xsl:variable name="value"   select="number($measureValue)"/>
557                <xsl:variable name="lcl"     select="number($measureLowerLimit)"/>
558                <xsl:variable name="ucl"     select="number($measureUpperLimit)"/>
559                <xsl:variable name="compare" select="number($comparativeValue)"/>
560
561                <!-- Only try to determine if all values are numeric. -->
562                <xsl:if test="ibis:_isNumeric($value)
563                        and ibis:_isNumeric($lcl)
564                        and ibis:_isNumeric($ucl)
565                        and ibis:_isNumeric($compare)
566                ">
567                        <xsl:if test="'LOW'  = $desirableValue">
568                                <xsl:choose>
569                                        <xsl:when test="($ucl &lt;  $compare)">Better</xsl:when>
570                                        <xsl:when test="($lcl &gt;= $compare)">Worse</xsl:when>
571                                        <xsl:when test="(5 = $numberOfGroups) and ($value &lt;= $compare)">Above</xsl:when>
572                                        <xsl:when test="(5 = $numberOfGroups) and ($value &gt;= $compare)">Below</xsl:when>
573                                        <xsl:when test="('LOW' = $desirableValue)">Similar</xsl:when>
574                                </xsl:choose>
575                        </xsl:if>
576
577                        <xsl:if test="'HIGH' = $desirableValue">
578                                <xsl:choose>
579                                        <xsl:when test="($lcl &gt;  $compare)">Better</xsl:when>
580                                        <xsl:when test="($ucl &lt;= $compare)">Worse</xsl:when>
581                                        <xsl:when test="(5 = $numberOfGroups) and ($value &gt;= $compare)">Above</xsl:when>
582                                        <xsl:when test="(5 = $numberOfGroups) and ($value &lt;= $compare)">Below</xsl:when>
583                                        <xsl:otherwise>Similar</xsl:otherwise>
584                                </xsl:choose>
585                        </xsl:if>
586                </xsl:if>
587        </xsl:template>
588
589
590        <xsl:template name="ComparisonValues.gaugeName" 
591                ibis:doc="Localizes creation of gauge graphic name. This call is
592                        typically used to determine the gauge graphic to display.
593
594                        Value returned: compareIndex _ desired value _ number of groups:
595                        better_low_3 or 4, better_high_3 or 4,
596                        above_low_3 or 4, above_high_3 or 4,
597                        below_low_3 or 4, below_high_3 or 4,
598                        similar_low_3 or 4, similar_high_3 or 4,
599                        worse_low_3 or 4, worse_high_3 or 4,
600                        na, insufficient.
601                "
602        >
603                <xsl:param name="comparisonClass"/>
604                <xsl:param name="measureValue"/>
605                <xsl:param name="measureLowerLimit"/>
606                <xsl:param name="measureUpperLimit"/>
607                <xsl:param name="comparativeValue"/>
608                <xsl:param name="desirableValue"
609                        ibis:doc="This is the MEASURE/DESIRABLE_VALUE.  The current usage
610                                is an index where 0=low is better and + means high is better.
611                                The measure's DV is numeric to be flexible for future uses -
612                                e.g. so that actual numeric target type values can be used. 
613                        "
614                />
615                <xsl:param name="numberOfGroups" select="$ComparisonValues.defaultNumberOfGroups"/>
616
617                <xsl:variable name="comparisonClass">
618                        <xsl:if test="0 != string-length($comparisonClass)"><xsl:value-of select="$comparisonClass"/></xsl:if>
619                        <xsl:if test="0 = string-length($comparisonClass)">
620                                <xsl:call-template name="ComparisonValues.comparisonClass">
621                                        <xsl:with-param name="measureValue"      select="$measureValue"/>
622                                        <xsl:with-param name="comparativeValue"  select="$comparativeValue"/>
623                                        <xsl:with-param name="measureLowerLimit" select="$measureLowerLimit"/>
624                                        <xsl:with-param name="measureUpperLimit" select="$measureUpperLimit"/>
625                                        <xsl:with-param name="desirableValue"    select="$desirableValue"/>
626                                        <xsl:with-param name="numberOfGroups"    select="$numberOfGroups"/>
627                                </xsl:call-template>
628                        </xsl:if>
629                </xsl:variable>
630                <xsl:value-of select="if('' != $comparisonClass) then concat(lower-case($comparisonClass), '_', lower-case($desirableValue), '_', $numberOfGroups) else 'na'"/>
631        </xsl:template>
632
633
634
635        <xsl:template name="ComparisonValues.publishedIndicators" 
636                ibis:doc="builds a simple list struct:
637                        INDICATOR
638                                NAME
639                                TITLE - complete
640                                COMMUNITY
641                                        xxx
642                                STATE
643                                        xxx
644                                US
645                                        xxx
646                                VALUE_TYPE
647                "
648        >
649                <xsl:param name="publishedIndicators"/>
650                <xsl:param name="indicatorProfileXMLFilePath"/>
651                <xsl:param name="communityDimensionName"/>
652                <xsl:param name="communityDimensionValue"/>
653                <xsl:param name="stateDimensionName"/>
654                <xsl:param name="stateDimensionValue"/>
655                <xsl:param name="usDimensionName"/>
656                <xsl:param name="usDimensionValue"/>
657                <xsl:param name="valueTypes"/>
658                <xsl:param name="measures"/>
659
660                <xsl:for-each select="$publishedIndicators">
661                        <xsl:sort select="SORT_ORDER" data-type="number" order="ascending"/>
662                        <xsl:sort select="NAME" data-type="text" order="ascending"/>
663
664                        <xsl:variable name="indicator" select="document(concat($indicatorProfileXMLFilePath, '/', NAME, '.xml'), /)/INDICATOR"/>
665                        <xsl:variable name="community" select="$indicator//DATASET//RECORD[ DIMENSIONS/DIMENSION[(NAME = $communityDimensionName) and (VALUE = $communityDimensionValue)] ]"/>
666<xsl:message select="concat('C M N: ', $community/MEASURE/NAME, ', state found: ', count($indicator//DATASET//RECORD[ DIMENSIONS/DIMENSION[(NAME = $stateDimensionName) and (VALUE = $stateDimensionValue)] and MEASURE/NAME = $community/MEASURE/NAME]) )"/>
667
668                        <xsl:if test="exists($community/*)">
669                        <INDICATOR>
670                                <xsl:copy-of select="$indicator/NAME"/>
671                                <TITLE><xsl:value-of select="ibis:getIndicatorTitle($indicator)"/></TITLE>
672
673                       
674                                <COMMUNITY><xsl:copy-of select="$community"/></COMMUNITY>
675                                <STATE><xsl:copy-of select="$indicator//DATASET//RECORD[ DIMENSIONS/DIMENSION[(NAME = $stateDimensionName) and (VALUE = $stateDimensionValue)] and (MEASURE/NAME = $community/MEASURE/NAME) ][last()]"/></STATE>
676                                <US><xsl:copy-of select="$indicator//DATASET//RECORD[ DIMENSIONS/DIMENSION[(NAME = $usDimensionName) and (VALUE = $usDimensionValue)] and (MEASURE/NAME = $community/MEASURE/NAME) ][last()]"/></US>
677                                <xsl:copy-of select="$valueTypes//VALUE_TYPE[NAME = $measures//MEASURE[NAME = $community/MEASURE/NAME]/VALUE_TYPE_NAME]"/>
678                        </INDICATOR>
679                        </xsl:if>
680                </xsl:for-each>
681        </xsl:template>
682
683</xsl:stylesheet>
684<!-- ============================= End of File ============================= -->
Note: See TracBrowser for help on using the repository browser.