Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / XML, XSL, XPath, XQuery Новый топик    Ответить
 xsl поменять значение элемента не изменяя xml  [new]
evgen29
Member

Откуда:
Сообщений: 125
Здравствуйте!
Есть xml типа
<temp>
  <header>...</header>
  <body>
    <line>
      <a>1</a>
      <b>2</b>
      <c>3</c>
    </line>
    <line>
      <a>1</a>
      <b>2</b>
      <c>3</c>
    </line>
  </body>
</temp>


нужно с помощью xsl изменить значение c=a*b
и добавить после c элемент d=a+b,
при этом оставив структуру как есть, чтобы на выходе было:
<temp>
  <header>...</header>
  <body>
    <line>
      <a>1</a>
      <b>2</b>
      <c>2</c>
      <d>3</d>
    </line>
    <line>
      <a>1</a>
      <b>2</b>
      <c>3</c>
      <d>3</d>
    </line>
  </body>
</temp>


настоящий шаблон сложнее, но суть та же. Делаю по-разному, но получается на выходе белеберда.
28 сен 18, 12:50    [21688996]     Ответить | Цитировать Сообщить модератору
 Re: xsl поменять значение элемента не изменяя xml  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11263
Вам нужно переопределить шаблон для нужных элементов, а для остальных вставить обычный копирующий шаблон
<?xml version="1.0"?>
<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">
  
  <xsl:output encoding="UTF-8" method="xml"/>
  
  <xsl:template match="line">
    <xsl:copy>
      <xsl:apply-templates/>
      <d>
        <xsl:value-of select="a + b"/>
      </d>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="c">
    <xsl:copy>
      <xsl:value-of select="../a * ../b"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="*">
    <xsl:copy>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
28 сен 18, 14:23    [21689097]     Ответить | Цитировать Сообщить модератору
Все форумы / XML, XSL, XPath, XQuery Ответить