Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как заменить часть значения атрибута на значение другого атрибута? / 7 сообщений из 7, страница 1 из 1
22.02.2022, 12:04
    #40135806
eliasum
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить часть значения атрибута на значение другого атрибута?
Как сделать так, чтобы в шаблоне XSLT 1.0 для входного xml:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<a>
  <Item key="1" title="№ @key">
    <b>
      <Item key="2" title="№ @key">
        <Item key="3">
          <Item key="4" title="№ @key">
            <c></c>
          </Item>
        </Item>
        <Item key="5" title="№ @key">
        </Item>
      </Item>
    </b>
  </Item>
</a>



заменить все вхождения @key на соответствующее значение атрибута key этого же тега:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<a>
  <Item key="1" title="№ 1">
    <b>
      <Item key="2" title="№ 2">
        <Item key="3">
          <Item key="4" title="№ 4">
            <c></c>
          </Item>
        </Item>
        <Item key="5" title="№ 5">
        </Item>
      </Item>
    </b>
  </Item>
</a>
...
Рейтинг: 0 / 0
22.02.2022, 12:38
    #40135822
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить часть значения атрибута на значение другого атрибута?
Отдельный копирующий шаблон для Item, в котором атрибут title собирается вручную, и общий копирующий шаблон для всего остального:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="Item">
    <xsl:copy>
      <xsl:copy-of select="@key" />
      <xsl:if test="@title">
        <xsl:attribute name="title">
          <xsl:value-of select="concat(substring-before(@title, '@key'), @key, substring-after(@title, '@key'))" />
        </xsl:attribute>
      </xsl:if>
      <xsl:apply-templates />
    </xsl:copy>
  </xsl:template>
  
  <xsl:template match="@*|*">
    <xsl:copy>
      <xsl:apply-templates select="@*|*" />
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
...
Рейтинг: 0 / 0
22.02.2022, 13:12
    #40135839
eliasum
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить часть значения атрибута на значение другого атрибута?
Сон Веры Павловны, спасибо ))
...
Рейтинг: 0 / 0
22.02.2022, 16:44
    #40135910
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить часть значения атрибута на значение другого атрибута?
Можно проще. Применить специализированный шаблон непосредственно к атрибуту

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="Item/@key" priority="1">
    <xsl:copy/>
  </xsl:template>

  <xsl:template match="Item/@*">
    <xsl:attribute name="{name()}">
        <xsl:value-of select="concat(substring-before(., '@key'), ../@key, substring-after(., '@key'))" />
    </xsl:attribute>
  </xsl:template>
  
  <xsl:template match="@*|*">
    <xsl:copy>
      <xsl:apply-templates select="@*|*" />
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

или еще проще, если нужно обработать только атрибут title
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="Item/@title">
    <xsl:attribute name="{name()}">
        <xsl:value-of select="concat(substring-before(., '@key'), ../@key, substring-after(., '@key'))" />
    </xsl:attribute>
  </xsl:template>
  
  <xsl:template match="@*|*">
    <xsl:copy>
      <xsl:apply-templates select="@*|*" />
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
...
Рейтинг: 0 / 0
22.02.2022, 18:00
    #40135950
eliasum
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить часть значения атрибута на значение другого атрибута?
_Vasilisk_, спасибо))

А если задача немного усложнится таким образом, что символ @key может быть у любого атрибута в любом месте у любого тега с атрибутом key, например так:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<a>
  <desc key="1" attr1="№ @key" attr2="@key №"  attr3="">
    <b>
      <slot key="2" attr4="@key">
        <val key="3">
          <fix key="4" title11="@key @key">
            <c></c>
          </fix>
        </val>
        <numb key="5" title12="z@keyz in @key">
        </numb>
      </slot>
    </b>
  </desc>
</a>



Так же любое вхождение @key заменяется на значение атрибута key в текущем теге
...
Рейтинг: 0 / 0
22.02.2022, 21:11
    #40135980
_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.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  
  <xsl:output method="xml" encoding="UTF-8"/>
  
  <xsl:template match="@key" priority="1">
    <xsl:copy/>
  </xsl:template>

  <xsl:template match="*[@key]/@*">
    <xsl:attribute name="{name()}">
        <xsl:call-template name="replace">
          <xsl:with-param name="str" select="."/>
          <xsl:with-param name="find" select="'@key'"/>
          <xsl:with-param name="replace" select="../@key"/>
        </xsl:call-template>
    </xsl:attribute>
  </xsl:template>
  
  <xsl:template match="@*|*">
    <xsl:copy>
      <xsl:apply-templates select="@*|*" />
    </xsl:copy>
  </xsl:template>

  <xsl:template name="replace">
    <xsl:param name="str"/>
    <xsl:param name="find"/>
    <xsl:param name="replace"/>
    <xsl:choose>
      <xsl:when test="contains($str, $find)">
        <xsl:variable name="prefix" select="substring-before($str, $find)"/>
        <xsl:variable name="suffix">
          <xsl:call-template name="replace">
            <xsl:with-param name="str" select="substring-after($str, $find)"/>
            <xsl:with-param name="find" select="$find"/>
            <xsl:with-param name="replace" select="$replace"/>
          </xsl:call-template>
        </xsl:variable>
        <xsl:value-of select="concat($prefix, $replace, $suffix)"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$str"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>
...
Рейтинг: 0 / 0
23.02.2022, 11:16
    #40136050
eliasum
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заменить часть значения атрибута на значение другого атрибута?
_Vasilisk_, спасибо большое))
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как заменить часть значения атрибута на значение другого атрибута? / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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