Данные:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
<GOODS>
<row Number="1" Priority="1" IsChecked="1" Semester="1" Name_RU="История России" Credit="4.0000" Hours="144" Sign_RU="ЭКЗ" IsAuto="1" NeedExam="0" Result="0.0000" ResultSign="хор." />
<row Number="1" Priority="2" IsChecked="1" Semester="1" Name_RU="Психология" Credit="2.0000" Hours="72" Sign_RU="ЗАЧ" IsAuto="1" NeedExam="0" Result="0.0000" ResultSign="зач." />
<row Number="1" Priority="1" IsChecked="1" Semester="3" Name_RU="Иностранный язык в сфере юриспруденции" Credit="2.0000" Hours="180" Sign_RU="ЭКЗ" IsAuto="1" NeedExam="0" Result="0.0000" ResultSign="хор." />
<row Number="2" Priority="1" IsChecked="1" Semester="3" Name_RU="Философия" Credit="2.0000" Hours="72" Sign_RU="ЗАЧ" IsAuto="1" NeedExam="0" Result="0.0000" ResultSign="хор." />
<row Number="4" Priority="2" IsChecked="1" Semester="3" Name_RU="Безопасность жизнедеятельности" Credit="2.0000" Hours="72" Sign_RU="ЗАЧ" IsAuto="1" NeedExam="0" Result="0.0000" ResultSign="зач." />
<row Number="10" Priority="26" IsChecked="1" Semester="6" Name_RU="Уголовное право" Credit="3.5000" Hours="396" Sign_RU="ЭКЗ" IsAuto="1" NeedExam="0" Result="0.0000" ResultSign="удов." />
<row Number="1" Priority="1" IsChecked="1" Semester="1" GoodsID="192" Name_RU="Конфликтология" Credit="2.0000" Hours="72" IsAuto="0" />
<row Number="2" Priority="2" IsChecked="1" Semester="1" GoodsID="187" Name_RU="Культура речи и деловое общение" Credit="2.0000" Hours="108" IsAuto="0" />
<row Number="2" Priority="3" IsChecked="1" Semester="1" GoodsID="194" Name_RU="Логика" Credit="2.0000" Hours="36" IsAuto="0" />
<row Number="2" Priority="4" IsChecked="1" Semester="1" GoodsID="378" Name_RU="Основы бухгалтерского учета" Credit="2.0000" Hours="72" IsAuto="0" />
<row Number="1" Priority="17" IsChecked="1" Semester="1" GoodsID="446" Name_RU="Теория государства и права" Credit="4.0000" Hours="396" IsAuto="0" />
<row Number="2" Priority="19" IsChecked="1" Semester="1" GoodsID="382" Name_RU="История отечественного государства и права" Credit="4.0000" Hours="252" IsAuto="0" />
<row Number="5" Priority="2" IsChecked="1" Semester="2" GoodsID="14" Name_RU="Профессиональная этика" Credit="2.0000" Hours="72" IsAuto="0" />
<row Number="1" Priority="16" IsChecked="1" Semester="2" GoodsID="375" Name_RU="Информационные технологии в юридической деятельности" Credit="4.0000" Hours="144" IsAuto="0" />
<row Number="5" Priority="17" IsChecked="1" Semester="2" GoodsID="577" Name_RU="Ценные бумаги" Credit="2.0000" Hours="108" IsAuto="0" />
<row Number="1" Priority="17" IsChecked="1" Semester="2" GoodsID="446" Name_RU="Теория государства и права" Credit="6.0000" Hours="396" IsAuto="0" />
<row Number="3" Priority="19" IsChecked="1" Semester="2" GoodsID="383" Name_RU="История государства и права зарубежных стран" Credit="4.0000" Hours="288" IsAuto="0" />
<row Number="1" Priority="38" IsChecked="1" Semester="2" GoodsID="201" Name_RU="Концепции современного естествознания" Credit="3.0000" Hours="72" IsAuto="0" />
<row Number="4" Priority="19" IsChecked="1" Semester="3" GoodsID="448" Name_RU="Конституционное право" Credit="3.0000" Hours="324" IsAuto="0" />
<row Number="7" Priority="23" IsChecked="1" Semester="3" GoodsID="449" Name_RU="Гражданское право" Credit="3.5000" Hours="720" IsAuto="0" />
<row Number="8" Priority="24" IsChecked="1" Semester="3" GoodsID="460" Name_RU="Международное право" Credit="5.0000" Hours="144" IsAuto="0" />
<row Number="2" Priority="39" IsChecked="1" Semester="3" GoodsID="376" Name_RU="Математика для юристов" Credit="2.0000" Hours="72" IsAuto="0" />
<row Number="1" Priority="2" IsChecked="1" Semester="4" GoodsID="468" Name_RU="Муниципальное право России" Credit="4.0000" Hours="180" IsAuto="0" />
<row Number="2" Priority="11" IsChecked="1" Semester="4" GoodsID="477" Name_RU="Юридическая служба предприятия" Credit="4.0000" Hours="144" IsAuto="0" />
<row Number="4" Priority="19" IsChecked="1" Semester="4" GoodsID="448" Name_RU="Конституционное право" Credit="1.0000" Hours="324" IsAuto="0" />
<row Number="5" Priority="20" IsChecked="1" Semester="4" GoodsID="447" Name_RU="Административное право" Credit="4.0000" Hours="252" IsAuto="0" />
<row Number="6" Priority="22" IsChecked="1" Semester="4" GoodsID="221" Name_RU="Трудовое право" Credit="4.0000" Hours="252" IsAuto="0" />
<row Number="7" Priority="23" IsChecked="1" Semester="4" GoodsID="449" Name_RU="Гражданское право" Credit="4.5000" Hours="720" IsAuto="0" />
<row Number="2" Priority="3" IsChecked="1" Semester="5" GoodsID="470" Name_RU="Семейное право" Credit="4.0000" Hours="144" IsAuto="0" />
<row Number="3" Priority="3" IsChecked="1" Semester="5" GoodsID="467" Name_RU="Уголовно-исполнительное право" Credit="5.0000" Hours="108" IsAuto="0" />
<row Number="4" Priority="4" IsChecked="1" Semester="5" GoodsID="466" Name_RU="Юридическая психология" Credit="5.0000" Hours="180" IsAuto="0" />
<row Number="5" Priority="5" IsChecked="1" Semester="5" GoodsID="471" Name_RU="Правоохранительные органы" Credit="4.0000" Hours="108" IsAuto="0" />
<row Number="5" Priority="20" IsChecked="1" Semester="5" GoodsID="447" Name_RU="Административное право" Credit="4.0000" Hours="252" IsAuto="0" />
<row Number="6" Priority="22" IsChecked="1" Semester="5" GoodsID="221" Name_RU="Трудовое право" Credit="4.0000" Hours="252" IsAuto="0" />
<row Number="7" Priority="23" IsChecked="1" Semester="5" GoodsID="449" Name_RU="Гражданское право" Credit="4.0000" Hours="720" IsAuto="0" />
<row Number="11" Priority="27" IsChecked="1" Semester="5" GoodsID="450" Name_RU="Гражданский процесс" Credit="6.0000" Hours="216" IsAuto="0" />
<row Number="12" Priority="28" IsChecked="1" Semester="5" GoodsID="454" Name_RU="Уголовный процесс" Credit="7.0000" Hours="216" IsAuto="0" />
<row Number="13" Priority="29" IsChecked="1" Semester="5" GoodsID="264" Name_RU="Финансовое право" Credit="4.0000" Hours="180" IsAuto="0" />
<row Number="18" Priority="33" IsChecked="1" Semester="5" GoodsID="459" Name_RU="Налоговое право" Credit="6.0000" Hours="144" IsAuto="0" />
<row Number="20" Priority="35" IsChecked="1" Semester="5" GoodsID="464" Name_RU="Право социального обеспечения" Credit="4.0000" Hours="180" IsAuto="0" />
<row Number="6" Priority="6" IsChecked="1" Semester="6" GoodsID="574" Name_RU="Жилищное право" Credit="3.0000" Hours="180" IsAuto="0" />
<row Number="6" Priority="19" IsChecked="1" Semester="6" GoodsID="163" Name_RU="Право интеллектуальной собственности" Credit="3.0000" Hours="108" IsAuto="0" />
<row Number="7" Priority="23" IsChecked="1" Semester="6" GoodsID="449" Name_RU="Гражданское право" Credit="5.0000" Hours="720" IsAuto="0" />
<row Number="9" Priority="25" IsChecked="1" Semester="6" GoodsID="456" Name_RU="Земельное право" Credit="4.0000" Hours="144" IsAuto="0" />
<row Number="14" Priority="30" IsChecked="1" Semester="6" GoodsID="189" Name_RU="Предпринимательское право" Hours="144" IsAuto="0" />
<row Number="16" Priority="32" IsChecked="1" Semester="6" GoodsID="451" Name_RU="Арбитражный процесс" Credit="4.0000" Hours="144" IsAuto="0" />
<row Number="19" Priority="34" IsChecked="1" Semester="6" GoodsID="461" Name_RU="Международное частное право" Credit="5.0000" Hours="108" IsAuto="0" />
<row Number="15" Priority="31" IsChecked="1" Semester="7" GoodsID="455" Name_RU="Экологическое право" Credit="4.5000" Hours="180" IsAuto="0" />
<row Number="17" Priority="32" IsChecked="1" Semester="7" GoodsID="463" Name_RU="Криминалистика" Credit="2.0000" Hours="108" IsAuto="0" />
<row Number="3" Priority="13" IsChecked="0" Semester="8" GoodsID="479" Name_RU="Правовые проблемы ресурсопользования" Credit="3.0000" Hours="108" IsAuto="0" />
<row Number="3" Priority="14" IsChecked="1" Semester="8" GoodsID="480" Name_RU="Конкурентное право и защита прав потребителей" Credit="3.0000" Hours="108" IsAuto="0" />
<row Number="15" Priority="31" IsChecked="1" Semester="8" GoodsID="455" Name_RU="Экологическое право" Credit="1.5000" Hours="180" IsAuto="0" />
<row Number="17" Priority="32" IsChecked="1" Semester="8" GoodsID="463" Name_RU="Криминалистика" Credit="4.0000" Hours="108" IsAuto="0" />
<row Number="7" Priority="8" IsChecked="1" Semester="9" GoodsID="499" Name_RU="Криминология" Credit="4.0000" Hours="108" IsAuto="0" />
<row Number="4" Priority="15" IsChecked="1" Semester="9" GoodsID="572" Name_RU="Юридические лица" Credit="3.0000" Hours="108" IsAuto="0" />
<row Number="4" Priority="16" IsChecked="0" Semester="9" GoodsID="478" Name_RU="Гражданско-правовые договоры" Credit="3.0000" Hours="108" IsAuto="0" />
<row Number="1" Priority="1" IsChecked="1" Semester="10" GoodsID="1986" Name_RU="Государственный экзамен по дисциплине "Теория государства и права"" Credit="4.0000" Hours="144" IsAuto="0" />
<row Number="2" Priority="2" IsChecked="1" Semester="10" GoodsID="1987" Name_RU="Государственный междисциплинарный экзамен по дисциплинам "Уголовное право" и "Уголовный процесс"" Credit="4.0000" Hours="144" IsAuto="0" />
<row Number="3" Priority="3" IsChecked="1" Semester="10" GoodsID="1910" Name_RU="Выпускная квалификационная работа (бакалаврская работа)" Credit="4.0000" Hours="144" IsAuto="0" />
<row Number="1" Priority="9" IsChecked="1" Semester="10" GoodsID="476" Name_RU="Банковское право" Credit="3.0000" Hours="108" IsAuto="0" />
<row Number="1" Priority="10" IsChecked="0" Semester="10" GoodsID="573" Name_RU="Актуальные проблемы исполнительного производства РФ, практика исполнения" Credit="3.0000" Hours="108" IsAuto="0" />
<row Number="2" Priority="11" IsChecked="1" Semester="10" GoodsID="477" Name_RU="Юридическая служба предприятия" Credit="3.0000" Hours="144" IsAuto="0" />
<row Number="2" Priority="12" IsChecked="0" Semester="10" GoodsID="575" Name_RU="Автоматизированные комплексы, информационно-правовые системы в деятельности ФССП России" Credit="3.0000" Hours="108" IsAuto="0" />
<row Number="5" Priority="18" IsChecked="0" Semester="10" GoodsID="590" Name_RU="Доказательства в гражданском процессе" Credit="3.0000" Hours="108" IsAuto="0" />
<row Number="6" Priority="19" IsChecked="0" Semester="10" GoodsID="576" Name_RU="Гражданское и торговое право зарубежный стран" Credit="3.0000" Hours="108" IsAuto="0" />
<row Number="2" Priority="51" IsChecked="1" Semester="10" GoodsID="108" Name_RU="Преддипломная" Credit="6.0000" Hours="216" IsAuto="0" />
</GOODS>
Шаблон:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
<xsl:template match="GOODS">
<table id="goods">
<thead>
<th>Сем</th>
<th colspan="2">№</th>
<th>Название дисциплины</th>
<th>Зач. ед.</th>
<th>Часы</th>
<th>КП</th>
<th>Зач.</th>
<th>Экз.</th>
</thead>
<tbody>
<tr><th colspan="9">Дисциплины учебного плана</th></tr>
<xsl:for-each select="*[@IsAuto=0][not(preceding-sibling::*[@IsAuto=0]/@Semester = @Semester)]">
<xsl:apply-templates select="/GOODS/*[@IsAuto=0][@Semester=current()/@Semester]" mode="NotAuto"/>
</xsl:for-each>
</tbody>
<tfoot>
<tr>
<th colspan="4" align="right">ИТОГО</th>
<td><xsl:value-of select="sum(*[@IsChecked=1]/@Credit)"/></td>
<td colspan="4"/>
</tr>
</tfoot>
</table>
</xsl:template>
<xsl:template match="GOODS/*" mode="NotAuto">
<tr>
<xsl:if test="position()=1">
<xsl:variable name="rs">
<xsl:choose>
<xsl:when test="@Semester mod 2 = 0">2</xsl:when>
<xsl:otherwise>1</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<td style="vertical-align:top" rowspan="{count(/GOODS/*[@IsAuto=0][@Semester=current()/@Semester])+$rs}">
<xsl:value-of select="@Semester"/>
</td>
</xsl:if>
<xsl:variable name="p" select="count(preceding-sibling::*)"/>
<xsl:variable name="startPos"><xsl:apply-templates select="preceding-sibling::*[1]" mode="startPos"/></xsl:variable>
<xsl:variable name="endPos"><xsl:apply-templates select="following-sibling::*[1]" mode="endPos"/></xsl:variable>
<xsl:variable name="hasNoCheck" select="count(/GOODS/*[position() >= $startPos and position() <= $endPos and @IsChecked=0])" />
<xsl:call-template name="DV"/>
<td>
<xsl:if test="@IsChecked=0"><xsl:attribute name="style">color:gray</xsl:attribute></xsl:if>
P<xsl:value-of select="$p"/>
SP<xsl:value-of select="$startPos"/>
EP<xsl:value-of select="$endPos"/>
N<xsl:value-of select="@Number"/>
NC<xsl:value-of select="$hasNoCheck"/>
<br/><xsl:value-of select="@Name_RU"/>
</td>
<td><xsl:value-of select="format-number(@Credit,'##.#')"/></td>
<td align="center"><xsl:value-of select="@Hours"/></td>
<td align="center"></td>
<td align="center"></td>
<td align="center"></td>
</tr>
<xsl:if test="position()=last()">
<tr>
<th colspan="3" align="right">Итого <xsl:value-of select="@Semester"/> семестр</th>
<td><xsl:value-of select="sum(/GOODS/*[@IsAuto=0][@IsChecked=1][@Semester=current()/@Semester]/@Credit)"/></td>
<td colspan="4"/>
</tr>
<xsl:if test="@Semester mod 2 = 0">
<tr>
<th colspan="3" align="right">Итого за <xsl:value-of select="@Semester div 2"/> год обучения</th>
<td><xsl:value-of select="sum(/GOODS/*[@IsAuto=0][@IsChecked=1][@Semester=current()/@Semester or Semester=current()/@Semester - 1]/@Credit)"/></td>
<td colspan="4"/>
</tr>
</xsl:if>
</xsl:if>
</xsl:template>
<xsl:template name="DV">
<xsl:variable name="p" select="count(preceding-sibling::*)"/>
<xsl:variable name="startPos"><xsl:apply-templates select="preceding-sibling::*[1]" mode="startPos"/></xsl:variable>
<xsl:variable name="endPos"><xsl:apply-templates select="following-sibling::*[1]" mode="endPos"/></xsl:variable>
<xsl:variable name="hasNoCheck" select="count(/GOODS/*[position() >= $startPos and position() <= $endPos and @IsChecked=0])" />
<xsl:if test="not(preceding-sibling::*[1]/@Number = current()/@Number and $hasNoCheck>0)">
<td>
<xsl:choose>
<xsl:when test="following-sibling::*[1]/@Number = current()/@Number and $hasNoCheck>0">
<xsl:attribute name="rowspan">2</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="colspan">2</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
<xsl:value-of select="position()"/>
</td>
<xsl:if test="following-sibling::*[1]/@Number = current()/@Number and $hasNoCheck>0">
<td rowspan="2">ДВ</td>
</xsl:if>
</xsl:if>
</xsl:template>
<xsl:template match="GOODS/*" mode="startPos">
<xsl:choose>
<xsl:when test="following-sibling::*[1]/@Number = current()/@Number">
<xsl:apply-templates select="preceding-sibling::*[1]" mode="startPos"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="count(preceding-sibling::*) +1"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="GOODS/*" mode="endPos">
<xsl:choose>
<xsl:when test="preceding-sibling::*[1]/@Number = current()/@Number">
<xsl:apply-templates select="following-sibling::*[1]" mode="endPos"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="count(preceding-sibling::*) -1"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Задача: объединить две строки в одну по следующим признакам:
1) У двух идущих подряд записей должен быть одинаковый @Semester и @Number
2) У одной из этих записей должно быть @IsChecked=0
Объединение происходит в шаблоне DV.
Что я делаю: находясь в контексте row, определяю абсолютную позицию (относительная position() разбита блоками по @semester), с которой начинается текущий @Number ($startPos) и которой заканчивается ($endPos), а потом считаю количество записей в этом промежутке, имеющих @IsChecked=0 ($hasNoCheck):
1.
<xsl:variable name="hasNoCheck" select="count(/GOODS/*[position() >= $startPos and position() <= $endPos and @IsChecked=0])" />
Тут-то и проблема.
В данных 4 таких блока, но объединяются только два. Начальная и конечная позиции определяются правильно, но hasNoCheck почему-то в двух случаях возвращает 0.