powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как заменить часть значения атрибута на значение другого атрибута?
7 сообщений из 7, страница 1 из 1
Как заменить часть значения атрибута на значение другого атрибута?
    #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
Как заменить часть значения атрибута на значение другого атрибута?
    #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
Как заменить часть значения атрибута на значение другого атрибута?
    #40135839
eliasum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны, спасибо ))
...
Рейтинг: 0 / 0
Как заменить часть значения атрибута на значение другого атрибута?
    #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
Как заменить часть значения атрибута на значение другого атрибута?
    #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
Как заменить часть значения атрибута на значение другого атрибута?
    #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
Как заменить часть значения атрибута на значение другого атрибута?
    #40136050
eliasum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_, спасибо большое))
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как заменить часть значения атрибута на значение другого атрибута?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (1): Анонимы (1)
Пользователи онлайн (9): Анонимы (8), Yandex Bot 9 мин.
x
x
Закрыть


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