Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSLT: Следующий template не видит изменения предыдущего template / 8 сообщений из 8, страница 1 из 1
16.11.2021, 12:26
    #40112296
kocher
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT: Следующий template не видит изменения предыдущего template
Всем привет!
Только начал вникать в 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
16.11.2021, 16:49
    #40112367
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT: Следующий template не видит изменения предыдущего template
kocher
дописанный мною template видит в <Type> изначальное значение, а не измененное.
Логично. Преобразование то применяется к исходному тексту.
...
Рейтинг: 0 / 0
16.11.2021, 17:14
    #40112372
kocher
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT: Следующий template не видит изменения предыдущего template
_Vasilisk_, т.е. никак не сделать последовательные изменения? Если мне нужно использовать логику предыдущего template, мне придется копировать его в свой в том или ином виде?

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

Что мешает сделать именованный template, и вызывать его явно через call-template в нужных местах?
...
Рейтинг: 0 / 0
16.11.2021, 18:54
    #40112387
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT: Следующий template не видит изменения предыдущего template
Код: 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
17.11.2021, 16:01
    #40112599
kocher
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT: Следующий template не видит изменения предыдущего template
_Vasilisk_, спасибо большое, понял куда копать! Правда ошибку выдает этот xsl в онлайн трансформаторах, но разберусь, думаю...
...
Рейтинг: 0 / 0
17.11.2021, 16:59
    #40112633
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT: Следующий template не видит изменения предыдущего template
kocher
Правда ошибку выдает этот xsl
Заменить xsl:varaiable на xsl:variable
...
Рейтинг: 0 / 0
18.11.2021, 09:40
    #40112735
kocher
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XSLT: Следующий template не видит изменения предыдущего template
_Vasilisk_, ага)) пару часов покопался вчера))) Спасибо, еще раз! Всё летает нужным образом!
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSLT: Следующий template не видит изменения предыдущего template / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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