XSLT - копирование определенных атрибутов на основе значения других атрибутов - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть следующий пример XML:

<?xml version="1.0" encoding="UTF-8"?>
<languages>
    <language lang='english' source='1'/>
    <language lang='english' source='2'/>
    <language lang='french' target='1' new1-fr='56' new2-fr='66'/>
    <language lang='german' target='1' new1-ger='20' new2-ger='21'/>
    <language lang='norwegian' target='2' new3-no='76' new2-no='15'/>
    <language lang='norwegian' target='1' new1-no='30'></language>
    <language lang='german' target='2' new1-ger='23' new2-ger='24' new3-ger='25'/>
</languages>

Я хочу сделать следующее: когда @target элементов языка (@ lang = french | german | norwegian) совпадает с @sourceязыка (@ lang = 'english)', скопируйте их атрибуты (все начинающиеся с 'new') как атрибуты к элементу language lang = 'english'

Вот как это должно выглядеть:

<languages>
    <language lang='english' source='1' new1-fr='56' new2-fr='66' new1-ger='20' new2-ger='21' new1-no='30'/>
    <language lang='english' source='2' new3-no='76' new2-no='15' new1-ger='23' new2-ger='24' new3-ger='25'/>
</languages>

Большое спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Поскольку вы уже приняли ответ, не показывая того, что пытались, я добавлю эту альтернативу, основанную на моем комментарии ...

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:key name="lang" match="language" use="@target"/>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="language[@source]">
    <xsl:copy>
      <xsl:apply-templates select="@*|key('lang',@source)/@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="language[@target]|language[@target]/@lang|@target"/>

</xsl:stylesheet>

Fiddle: http://xsltfiddle.liberty -development.net / gWvjQf2

0 голосов
/ 15 февраля 2019

Вы можете использовать следующие шаблоны.Первый отвечает только за копирование корневого узла

<xsl:template match="languages">
   <xsl:copy>
       <xsl:apply-templates select="@*|node()"/>
   </xsl:copy>
</xsl:template>

, а второй соответствует всем language элементам, которые имеют @source атрибуты.Затем он копирует сам элемент перед копированием всех атрибутов из исходного элемента и требуемых атрибутов элемента language, атрибут @target которого равен переменной $src - исключая атрибуты с именами lang и target.

<xsl:template match="language[@source]">
    <xsl:variable name="src" select="@source" />
    <xsl:copy>
        <xsl:copy-of select="@* | ../language[@target=$src]/@*[not(local-name(.) ='target') and not(local-name(.) ='lang')]"/>
    </xsl:copy>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...