Как добавить элемент в качестве атрибута, используя XSLT - PullRequest
0 голосов
/ 13 июня 2019

Как добавить элемент (дату) к элементу Level1 в качестве атрибута

ниже Источник xml

<level>
  <date> 2019-jan-01<date>
  <level1 name ="abc", age = 24>
    <level2 val1 = "asd"> 2.34</level2>
 </level1>
  <level1 name ="abc", age = 24>
    <level2 val1 = "asd"> 2.34</level2>
 </level1>
</level>

Целевой XML

<level>
  <level1 name ="abc", age = 24 , date = 2019-jan-01 >
    <level2 val1 = "asd"> 2.34</level2>
 </level1>
  <level1 name ="abc", age = 24 , date = 2019-jan-01>
    <level2 val1 = "asd"> 2.34</level2>
 </level1>
</level>

1 Ответ

2 голосов
/ 13 июня 2019

Исходный XML нужно немного очистить - убрать запятые, добавить кавычки и т. Д.:

<level>
  <date>2019-jan-01</date>
  <level1 name="abc" age="24">
    <level2 val1="asd">2.34</level2>
  </level1>
  <level1 name="abc" age="24">
    <level2 val1="asd">2.34</level2>
 </level1>
</level>

Тогда этот XSLT преобразует источник в вашу цель:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.1">

  <!-- exclude the date element -->
  <xsl:template match="date" />

  <!-- copy the level1 element adding an attribute -->
  <xsl:template match="level1">
    <xsl:copy>
      <xsl:attribute name="date">
        <xsl:value-of select="../date/text()"/>
      </xsl:attribute>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- keep everything the same unless explicit transformed by above -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

Результат:

<level>
  <level1 date="2019-jan-01" name="abc" age="24">
    <level2 val1="asd">2.34</level2>
  </level1>
  <level1 date="2019-jan-01" name="abc" age="24">
    <level2 val1="asd">2.34</level2>
 </level1>
</level>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...