Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как в XPath заменить жесткое название поля на название из переменной / 12 сообщений из 12, страница 1 из 1
11.10.2010, 14:39
    #36892691
dmnazarov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в XPath заменить жесткое название поля на название из переменной
извиняюсь за ламерский вопрос, но деваться некуда...

есть такое xslt выражение
<xsl:when test="count($currnode/following-sibling::Row[@MyGroup1=$grpFieldValue]) > 0)"
... и т.д.

оно работает,
но мне необходимо вместо жесткого указания имени поля вставить значение параметра xslt-темплэйта что бы использовать разные поля.
что-то типа
<xsl:when test="count($currnode/following-sibling::Row[@$GroupFieldName=$grpFieldValue]) > 0)"

вариант
<xsl:when test="count($currnode/following-sibling::Row[@*[name() = $GroupFieldName]=$grpFieldValue]) > 0)"
не проходит, а знаний, что не так не хватает
помогите плиз...
...
Рейтинг: 0 / 0
11.10.2010, 14:56
    #36892740
Andry Trushin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в XPath заменить жесткое название поля на название из переменной
dmnazarov,

оно?
Код: plaintext
<xsl:when test="count($currnode/following-sibling::Row[@*[name()=$GroupFieldName]=$grpFieldValue]) > 0)"> ...
...
Рейтинг: 0 / 0
11.10.2010, 14:57
    #36892743
Andry Trushin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в XPath заменить жесткое название поля на название из переменной
хм... недочитал.
почему не проходит?
...
Рейтинг: 0 / 0
11.10.2010, 15:00
    #36892758
dmnazarov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в XPath заменить жесткое название поля на название из переменной
выдает толька первый элемент из возможных
...
Рейтинг: 0 / 0
11.10.2010, 15:16
    #36892814
dmnazarov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в XPath заменить жесткое название поля на название из переменной
Извиняюсь за неполный ответ,
вот сам шаблон, он считает сумму по группам в xml-таблице
если использовать переменную, то сумма равна значению поля в первом элементе
если использовать имя поля то всё как надо

<xsl:template name="sumByGroup1">
<xsl:param name="currnode"/>
<xsl:param name="grpfieldname"/>
<xsl:param name="grpfieldvalue"/>
<xsl:param name="resfieldname"/>
<xsl:param name="res"/>

<xsl:variable name="curvalue" select="translate($currnode/@*[name() = $resfieldname],',','.')"/>

<xsl:variable name="curnumber">
<xsl:choose>
<xsl:when test="$curvalue!=''">
<xsl:value-of select="$curvalue"/>
</xsl:when>
<xsl:otherwise>
0
</xsl:otherwise>
</xsl:choose>
</xsl:variable>

<xsl:choose>
<!--<xsl:when test="count($currnode/following-sibling::Row[@Group=$fieldvalue])>0"> -->
<!-- <xsl:when test="count($currnode/following-sibling::Row[@Group=$grpfieldvalue])>0"> -->
<xsl:when test="count($currnode/following-sibling::Row[@*[name() = $grpfieldname] = $grpfieldvalue])>0">
<xsl:call-template name="sumByGroup1">
<xsl:with-param name="currnode" select="$currnode/following-sibling::Row[1]"/>
<xsl:with-param name="grpfieldname" select="$grpfieldname"/>
<xsl:with-param name="grpfieldvalue" select="$grpfieldvalue"/>
<xsl:with-param name="resfieldname" select="$resfieldname"/>
<xsl:with-param name="res" select="$res + number($curnumber)"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="format-number($res+number($curnumber), "#я##0,00'а.';-#я##0,00'а.'", "lcid1049")"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>


--------- Вызов делатеся так ---------
<td class="ms-gb">
<b >Сумма  =
<xsl:call-template name="sumByGroup1">
<xsl:with-param name="currnode" select="$nodeset"/>
<xsl:with-param name="grpfieldname" select="Group"/>
<xsl:with-param name="grpfieldvalue" select="$fieldvalue"/>
<xsl:with-param name="resfieldname" select="'Income'"/>
<xsl:with-param name="res" select="0"/>
</xsl:call-template>
</b>
</td>
...
Рейтинг: 0 / 0
11.10.2010, 15:44
    #36892875
Andry Trushin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в XPath заменить жесткое название поля на название из переменной
dmnazarov,

XML тоже выкладывай
...
Рейтинг: 0 / 0
11.10.2010, 15:53
    #36892899
Andry Trushin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в XPath заменить жесткое название поля на название из переменной
может так надо писать:
Код: plaintext
count($currnode/following-sibling::Row/@*[name() = $grpfieldname] = $grpfieldvalue)> 0 
или так:
Код: plaintext
count($currnode/following-sibling::Row[@*[name() = $grpfieldname and . = $grpfieldvalue])> 0 
короче, пробывать надо на чем-то.
...
Рейтинг: 0 / 0
11.10.2010, 16:40
    #36893049
dmnazarov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в XPath заменить жесткое название поля на название из переменной
Сами данные берутся из MSSQL-я через MS Sharepoint списки.
В принципе можно было бы подготовить тестовые, но выдрать полезный XSLT код из aspx формы я уже не осилю. Уж такая там портянка.

этот вариант
авторcount($currnode/following-sibling::Row/@*[name() = $grpfieldname] = $grpfieldvalue)>0
не скомпилировался, т.к. возвращается не множество.... и не может быть параметром COUNT

этот
авторcount($currnode/following-sibling::Row[@*[name() = $grpfieldname and . = $grpfieldvalue])>0
аналогичен первому предложенному варианту
автор<xsl:when test="count($currnode/following-sibling::Row[@*[name()=$GroupFieldName]=$grpFieldValue]) > 0)">
...
Рейтинг: 0 / 0
11.10.2010, 16:43
    #36893055
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в XPath заменить жесткое название поля на название из переменной
dmnazarov,

xml
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<root>
	<row q="w1" income="1"/>
	<row q="w" income="20"/>
	<row q="w1" income="300"/>
	<row q="w" income="4000"/>
	<row q="w1" income="50000"/>
	<row q="w" income="600000"/>
	<row q="w1" income="7000000"/>
	<row q="w" income="80000000"/>
	<row q="w1" income="900000000"/>
</root>

xsl
Код: plaintext
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.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
	<xsl:output method="text"/>
	<xsl:template match="/">
		<xsl:call-template name="sumByGroup1">
			<xsl:with-param name="currnode" select="root/row[2]"/>
			<xsl:with-param name="grpfieldname" select="'q'"/>
			<xsl:with-param name="grpfieldvalue" select="'w'"/>
			<xsl:with-param name="resfieldname" select="'income'"/>
			<xsl:with-param name="res" select="0"/>
		</xsl:call-template>
		<xsl:text>-</xsl:text>
		<xsl:call-template name="sumByGroup1">
			<xsl:with-param name="currnode" select="root/row[1]"/>
			<xsl:with-param name="grpfieldname" select="'q'"/>
			<xsl:with-param name="grpfieldvalue" select="'w1'"/>
			<xsl:with-param name="resfieldname" select="'income'"/>
			<xsl:with-param name="res" select="0"/>
		</xsl:call-template>
	</xsl:template>
	<xsl:template name="sumByGroup1">
		<xsl:param name="currnode"/>
		<xsl:param name="grpfieldname"/>
		<xsl:param name="grpfieldvalue"/>
		<xsl:param name="resfieldname"/>
		<xsl:param name="res"/>
		<xsl:variable name="curvalue" select="translate($currnode/@*[name() = $resfieldname],',','.')"/>
		<xsl:variable name="curnumber">
			<xsl:choose>
				<xsl:when test="$curvalue!=''">
					<xsl:value-of select="$curvalue"/>
				</xsl:when>
				<xsl:otherwise> 0 </xsl:otherwise>
			</xsl:choose>
		</xsl:variable>
		<xsl:choose>
			<!--<xsl:when test="count($currnode/following-sibling::Row[@Group=$fieldvalue])>0"> -->
			<!-- <xsl:when test="count($currnode/following-sibling::Row[@Group=$grpfieldvalue])>0"> -->
			<xsl:when test="count($currnode/following-sibling::row[@*[name() = $grpfieldname] = $grpfieldvalue])>0">
				<xsl:call-template name="sumByGroup1">
					<xsl:with-param name="currnode" select="$currnode/following-sibling::row[@*[name() = $grpfieldname] = $grpfieldvalue][1]"/>
					<xsl:with-param name="grpfieldname" select="$grpfieldname"/>
					<xsl:with-param name="grpfieldvalue" select="$grpfieldvalue"/>
					<xsl:with-param name="resfieldname" select="$resfieldname"/>
					<xsl:with-param name="res" select="$res + number($curnumber)"/>
				</xsl:call-template>
			</xsl:when>
			<xsl:otherwise>
				<xsl:value-of select="$res+number($curnumber)"/>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>
</xsl:stylesheet>

text
Код: plaintext
 80604020 - 907050301 
...
Рейтинг: 0 / 0
11.10.2010, 16:46
    #36893058
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в XPath заменить жесткое название поля на название из переменной
Проблема скорее всего в вызове шаблона - обрати внимание - я вызываю из корня один элемент. Сначала вызывал множество - выходил только первый элемент.
...
Рейтинг: 0 / 0
11.10.2010, 17:10
    #36893114
Andry Trushin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в XPath заменить жесткое название поля на название из переменной
refreg,

ну вот, не дал помучить человека.
там изначально было понятно, что проблема не в этом xPath. хорошо, что у тебя есть время генерить XML.
...
Рейтинг: 0 / 0
11.10.2010, 17:21
    #36893143
dmnazarov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в XPath заменить жесткое название поля на название из переменной
Спасибо, пока перевариваю Ваше решение.
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как в XPath заменить жесткое название поля на название из переменной / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]