powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSLT: Следующий template не видит изменения предыдущего template
8 сообщений из 8, страница 1 из 1
XSLT: Следующий template не видит изменения предыдущего template
    #40112296
kocher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!
Только начал вникать в xslt, возникла проблема, возможно связанная с недопониманием механизма преобразований. Гуглеж не помогает, да и не понятно как загуглить.

Есть файл xsl с преобразованием xml документа. В зависимости от текста <R1> и <Type> изменяется текст <Type>
Требуется приписать новый template, который на основании тэга <U> и уже измененного <Type> сделает изменение тэга <R3>.
Однако, дописанный мною template видит в <Type> изначальное значение, а не измененное. Прописал priority - не помогло.

Исходный xml
Код: xml
1.
2.
3.
4.
5.
6.
<BEGIN>
	<Type>BP</Type>
	<R1>М_ФР</R1>
	<R3>PE</R3>
	<U>PE</U>
</BEGIN>



Дописанный xsl
Код: xml
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.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:template match="@*|node()" priority="1">
		<xsl:copy>
			<xsl:apply-templates select="@*|node()"/>
		</xsl:copy>
	</xsl:template>
	<xsl:template match="BEGIN/Type" priority="2">
		<xsl:variable name="r1" select="ancestor::BEGIN/R1/text()"/>
		<xsl:choose>
			<xsl:when test=".='BP' and $r1='М_ОФ'">
				<Type>OF</Type>
			</xsl:when>
			<xsl:when test=".='BP' and $r1='М_ФР'">
				<Type>FR</Type>
			</xsl:when>
		</xsl:choose>
	</xsl:template>
	<xsl:template match="BEGIN/R3" priority="3">
		<xsl:variable name="type" select="ancestor::BEGIN/Type/text()"/>
		<xsl:variable name="u" select="ancestor::BEGIN/U/text()"/>
		<xsl:choose>
			<xsl:when test="$u='PE'">
				<R3>
					<xsl:value-of select="concat($type, 'P')"/>
				</R3>
			</xsl:when>
			<xsl:otherwise>
				<R3>
					<xsl:value-of select="concat($type, 'G')"/>
				</R3>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>
</xsl:stylesheet>



получающийся после преобразовани xml:
Код: xml
1.
2.
3.
4.
5.
6.
<BEGIN>
	  <Type>FR</Type>
	  <R1>М_ФР</R1>
	  <R3>BPP</R3>
	  <U>PE</U>
</BEGIN>



Т.е. значение у тега R3 состоит из изначального содержимого Type <R3> BP P</R3>
А нужен <R3> FR P</R3>

Помогите, пожалуйста!
Спасибо!
...
Рейтинг: 0 / 0
XSLT: Следующий template не видит изменения предыдущего template
    #40112367
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kocher
дописанный мною template видит в <Type> изначальное значение, а не измененное.
Логично. Преобразование то применяется к исходному тексту.
...
Рейтинг: 0 / 0
XSLT: Следующий template не видит изменения предыдущего template
    #40112372
kocher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_, т.е. никак не сделать последовательные изменения? Если мне нужно использовать логику предыдущего template, мне придется копировать его в свой в том или ином виде?

Собственно пока я так и сделал, но мне показалось это избыточным и есть вариант проще(короче)...
...
Рейтинг: 0 / 0
XSLT: Следующий template не видит изменения предыдущего template
    #40112375
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kocher
Если мне нужно использовать логику предыдущего template, мне придется копировать его в свой в том или ином виде?

Что мешает сделать именованный template, и вызывать его явно через call-template в нужных местах?
...
Рейтинг: 0 / 0
XSLT: Следующий template не видит изменения предыдущего template
    #40112387
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: xml
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.
<xsl:template name="getType">
  <xsl:param name="type"/>
  <xsl:param name="r1"/>
  <xsl:choose>
    <xsl:when test="$type='BP' and $r1='М_ОФ'">
      <xsl:value-of select="'OF'"/>
    </xsl:when>
    <xsl:when test="$type='BP' and $r1='М_ФР'">
      <xsl:value-of select="'FR'"/>
    </xsl:when>
  </xsl:choose>
</xsl:template>

<xsl:template match="BEGIN/Type">
  <xsl:varaiable name="type">
    <xsl:call-template name="getType">
      <xsl:with-param name="type" select="."/>
      <xsl:with-param name="r1" select="../R1"/>
    </xsl:call-template>
  </xsl:varaiable>
  <xsl:if test="$type">
    <Type>
      <xsl:value-of select="$type">
    </Type>
  </xsl:if>
</xsl:template>

<xsl:template match="BEGIN/R3">
  <xsl:varaiable name="type">
    <xsl:call-template name="getType">
      <xsl:with-param name="type" select="../Type"/>
      <xsl:with-param name="r1" select="../R1"/>
    </xsl:call-template>
  </xsl:varaiable>

  <R3>
    <xsl:variable name="u" select="../U"/>
    <xsl:choose>
      <xsl:when test="$u='PE'">
	<xsl:value-of select="concat($type, 'P')"/>
      </xsl:when>
      <xsl:otherwise>
	<xsl:value-of select="concat($type, 'G')"/>
      </xsl:otherwise>
    </xsl:choose>
  </R3>
</xsl:template>
...
Рейтинг: 0 / 0
XSLT: Следующий template не видит изменения предыдущего template
    #40112599
kocher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_, спасибо большое, понял куда копать! Правда ошибку выдает этот xsl в онлайн трансформаторах, но разберусь, думаю...
...
Рейтинг: 0 / 0
XSLT: Следующий template не видит изменения предыдущего template
    #40112633
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kocher
Правда ошибку выдает этот xsl
Заменить xsl:varaiable на xsl:variable
...
Рейтинг: 0 / 0
XSLT: Следующий template не видит изменения предыдущего template
    #40112735
kocher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_, ага)) пару часов покопался вчера))) Спасибо, еще раз! Всё летает нужным образом!
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSLT: Следующий template не видит изменения предыдущего template
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (1): Анонимы (1)
Пользователи онлайн (7): Анонимы (4), Yandex Bot, Bing Bot 2 мин., Cat2 4 мин.
x
x
Закрыть


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