Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / XML, XSL, XPath, XQuery Новый топик    Ответить
 Как узнать номер строки в xsl  [new]
leprechaun
Member

Откуда:
Сообщений: 153
Привет, вывожу строки в шаблон, по умолчанию при сохранении в хml2003 суммирование ячеек явную формулу проставило

<Cell ss:StyleID="s74" ss:Formula="=SUM(R[-2]C:R[-1]C)"></Cell>

Как изменить на R[-n] где n последняя строка?

Т.е. как сделать чтобы последняя строка подбивала сумму всей колонки, как узнать количество уже выведенных строк.
8 ноя 17, 16:53    [20937270]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать номер строки в xsl  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12900
<xsl:template match="Cell">\
  <xsl:if test="position() = count(..\Cell)">
    ...........
  </xsl:if>
</xsl:template
9 ноя 17, 15:08    [20940412]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать номер строки в xsl  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12900
Или еще проще
<xsl:template match="Cell">\
  <xsl:if test="position() = last()">
    ...........
  </xsl:if>
</xsl:template>
9 ноя 17, 15:09    [20940423]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать номер строки в xsl  [new]
leprechaun
Member

Откуда:
Сообщений: 153
Спасибо!
9 ноя 17, 17:50    [20940988]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать номер строки в xsl  [new]
leprechaun
Member

Откуда:
Сообщений: 153
Подниму тему, чето я в тот раз другим путем пошел, а сейчас таки надо определить номер строки и по этим советам не получается.
Может освежит кто.

Нужна переменная с номером последней заполненной строки. Как её получить?
14 фев 18, 17:50    [21191878]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать номер строки в xsl  [new]
leprechaun
Member

Откуда:
Сообщений: 153
Вернее даже так.
Есть цикл, в котором я в зависимости от условия могу выводить строку, могу не выводить.

Если добавляют в код

<xsl:if test="position() = last()">
<Row>
<Cell ss:StyleID="Default"><Data ss:Type="String"><xsl:value-of select="last()"/></Data></Cell>
</Row>
</xsl:if>

то last = всем перебранным в цикле элементам.

Мне же просто нужен индекс строки, с которой бы продолжилось наполнение файла открой я новую строку. Дно файла)
14 фев 18, 18:20    [21191977]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать номер строки в xsl  [new]
leprechaun
Member

Откуда:
Сообщений: 153
Или хотя бы дайте пожалуйста пример как счетчик-переменную вести этом формате.
14 фев 18, 18:21    [21191983]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать номер строки в xsl  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12900
leprechaun
Есть цикл
Где?
leprechaun
Если добавляют в код
Куда Вы это добавляете?
14 фев 18, 18:23    [21191986]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать номер строки в xsl  [new]
leprechaun
Member

Откуда:
Сообщений: 153
У меня формируется лист с отчетом.

Сначала шапка, потом цикл наполняющий отчет данными (но не всеми подряд, выборочно от условия). А position внутри я так понял просто считает все проходы внутри этого цикла.

В конце соответственно идут итоги и на этот момент мне нужно знать сколько я уже строк реально вывел в документ, где его окончание-то.
14 фев 18, 18:33    [21192011]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать номер строки в xsl  [new]
leprechaun
Member

Откуда:
Сообщений: 153
Добавлял position() и last() в цикл чтобы посмотреть как вообще работают.
14 фев 18, 18:35    [21192017]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать номер строки в xsl  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12900
leprechaun
В конце соответственно идут итоги
Т.е. кода не будет
15 фев 18, 14:08    [21193891]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать номер строки в xsl  [new]
leprechaun
Member

Откуда:
Сообщений: 153
Будет

...
<!--какая-то фиксированная шапка-->
<Row>
	<Cell ss:Index="3" ss:MergeAcross="2" ss:StyleID="Default"><Data ss:Type="String">Шапка: </Data></Cell>
</Row> 

<xsl:for-each select="XX/LIST_G_SUBKONTO/G_SUBKONTO">	

	<!--беру только соответствующие условию строки-->
	<xsl:if test="number(CF_SUMEND_DRPERSUBKONTO) != 0 and number(CF_SUMEND_DRPERSUBKONTO) >= number(/XX/CF_DR_SUM)"> 
	
		<Row>
			<Cell ss:StyleID="72"><Data ss:Type="Number"><xsl:value-of select="CF_SUMEND_DRPERSUBKONTO"/></Data></Cell>
			<Cell ss:StyleID="72"><Data ss:Type="Number"><xsl:value-of select="CF_DR_SUM"/></Data></Cell>	  
		</Row>				
	</xsl:if> 

	<!--last показывает общее количество итераций-->		
		<xsl:if test="position() = last()">
			<Row ss:AutoFitHeight="0" ss:Height="15">
				<Cell ss:StyleID="Default"><Data ss:Type="String">Количество строк: </Data></Cell>
				<Cell ss:StyleID="Default"><Data ss:Type="String"><xsl:value-of select="last()"/></Data></Cell>
			</Row>
		</xsl:if>
		
</xsl:for-each>

<!--Итоги-->
<Row>
	<!--Мне нужно знать сколько уже реально заполнено строк-->
</Row> 
15 фев 18, 14:43    [21194064]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать номер строки в xsl  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72988
<!--Мне нужно знать сколько уже реально заполнено строк-->
<xsl:value-of select="count(XX/LIST_G_SUBKONTO/G_SUBKONTO[number(CF_SUMEND_DRPERSUBKONTO)>= number(XX/CF_DR_SUM)])"/>
15 фев 18, 17:30    [21194714]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать номер строки в xsl  [new]
leprechaun
Member

Откуда:
Сообщений: 153
Antonariy
<!--Мне нужно знать сколько уже реально заполнено строк-->
<xsl:value-of select="count(XX/LIST_G_SUBKONTO/G_SUBKONTO[number(CF_SUMEND_DRPERSUBKONTO)>= number(XX/CF_DR_SUM)])"/>


Спасибо, проверил, полезно, по моему примеру строки считает.
Но я чуть упростил код, внутри еще условие которое может добавлять одну или несколько вложенных строк.
А нет возможности устроить какой-то счетчик по сработавшим командам <Row /> или просто узнать где мы позиционно в файле.
15 фев 18, 18:31    [21194865]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать номер строки в xsl  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12900
leprechaun
или просто узнать где мы позиционно в файле.
position()
16 фев 18, 15:30    [21197262]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать номер строки в xsl  [new]
leprechaun
Member

Откуда:
Сообщений: 153
_Vasilisk_
leprechaun
или просто узнать где мы позиционно в файле.
position()


Наверное я туплю, но всё же
position() - возвращает позицию или индекс узла относительно всех выбранных узлов в списке узлов

разве вернет мне она номер последней выведенной строки, я так понял просто считает уровни или количество итераций
а я хочу знать сколько строк отправил в документ командой Row. Которых может быть несколько в цикле.
16 фев 18, 18:50    [21197909]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать номер строки в xsl  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12900
Так?
<xsl:for-each select="XX/LIST_G_SUBKONTO/G_SUBKONTO[
  number(CF_SUMEND_DRPERSUBKONTO) != 0 and number(CF_SUMEND_DRPERSUBKONTO) >= number(/XX/CF_DR_SUM)
]">
	<Row>
		<Cell ss:StyleID="72"><Data ss:Type="Number"><xsl:value-of select="CF_SUMEND_DRPERSUBKONTO"/></Data></Cell>
		<Cell ss:StyleID="72"><Data ss:Type="Number"><xsl:value-of select="CF_DR_SUM"/></Data></Cell>	  
	</Row>				

	<!--last показывает общее количество итераций-->		
	<xsl:if test="position() = last()">
		<Row ss:AutoFitHeight="0" ss:Height="15">
			<Cell ss:StyleID="Default"><Data ss:Type="String">Количество строк: </Data></Cell>
			<Cell ss:StyleID="Default"><Data ss:Type="String"><xsl:value-of select="last()"/></Data></Cell>
		</Row>
	</xsl:if>
</xsl:for-each>
16 фев 18, 22:15    [21198181]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать номер строки в xsl  [new]
leprechaun
Member

Откуда:
Сообщений: 153
_Vasilisk_
Так?


Я виноват не полный пример дал, с одной строкой будет верно, но строк то может быть несколько, как это сосчитать

<xsl:for-each select="XX/LIST_G_SUBKONTO/G_SUBKONTO[
  number(CF_SUMEND_DRPERSUBKONTO) != 0 and number(CF_SUMEND_DRPERSUBKONTO) >= number(/XX/CF_DR_SUM)
]">
	<Row>
		<Cell ss:StyleID="72"><Data ss:Type="Number"><xsl:value-of select="CF_SUMEND_DRPERSUBKONTO"/></Data></Cell>
		<Cell ss:StyleID="72"><Data ss:Type="Number"><xsl:value-of select="CF_DR_SUM"/></Data></Cell>	  
	</Row>

	<!--Как сосчитать строки если их больше одной в цикле?-->
       <xsl:if a = "0">
	   <Row>
	   	<Cell ss:StyleID="72"><Data ss:Type="Number"><xsl:value-of select="CF_SUMEND_DRPERSUBKONTO_2"/></Data></Cell>
	   	<Cell ss:StyleID="72"><Data ss:Type="Number"><xsl:value-of select="CF_DR_SUM_2"/></Data></Cell>	  
   	   </Row>
       </xsl:if>

	<!--last показывает общее количество итераций-->		
	<xsl:if test="position() = last()">
		<Row ss:AutoFitHeight="0" ss:Height="15">
			<Cell ss:StyleID="Default"><Data ss:Type="String">Количество строк: </Data></Cell>
			<Cell ss:StyleID="Default"><Data ss:Type="String"><xsl:value-of select="last()"/></Data></Cell>
		</Row>
	</xsl:if>
</xsl:for-each>
17 фев 18, 00:32    [21198366]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать номер строки в xsl  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12900
leprechaun,

Тогда используйте способ Antonariy

<xsl:value-of select="
  count(XX/LIST_G_SUBKONTO/G_SUBKONTO[number(CF_SUMEND_DRPERSUBKONTO)>= number(XX/CF_DR_SUM)]) +
  count(XX/LIST_G_SUBKONTO/G_SUBKONTO[number(CF_SUMEND_DRPERSUBKONTO)>= number(XX/CF_DR_SUM) and a = 0])
"/>
17 фев 18, 13:19    [21198708]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать номер строки в xsl  [new]
leprechaun
Member

Откуда:
Сообщений: 153
Вроде как-то втиснуть получается этот код. Спасибо.
Хотелось бы более простого решения, увы.
19 фев 18, 15:25    [21202253]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать номер строки в xsl  [new]
leprechaun
Member

Откуда:
Сообщений: 153
Еще вопрос остался, а как правильно в этой конструкции суммирование делать

у меня NaN возвращает код

<Cell ss:StyleID="Default"><Data ss:Type="String"><xsl:value-of select="sum(XX/LIST_G_SUBKONTO/G_SUBKONTO[number(CF_SUMEND_DRPERSUBKONTO) >= number(/XX/CF_DR_SUM)])"/></Data></Cell>
19 фев 18, 15:45    [21202361]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать номер строки в xsl  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12900
leprechaun
как правильно в этой конструкции суммирование делать
Что Вы пытаетесь просуммировать?
19 фев 18, 17:22    [21202642]     Ответить | Цитировать Сообщить модератору
Все форумы / XML, XSL, XPath, XQuery Ответить