Входной XML выходной XML с XSL - PullRequest
0 голосов
/ 19 января 2012

У меня проблема, я не могу понять код XSL для "преобразования" XML в другой XML

Это входной XML:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<output>
  <cars>
    <car>
      <id>1</id>
      <brand>Audi</brand>
      <type>A3</type>
      <license>B-01-TST</license>
    </car>
    <car>
      <id>2</id>
      <brand>Volkwagen</brand>
      <type>Golf</type>
      <license>IF-02-TST</license>
    </car>
  </cars>
  <distances>
    <distance>
      <id_car>1</id_car>
      <date>20110901</date>
      <distance>111</distance>
    </distance>
    <distance>
      <id_car>1</id_car>
      <date>20110902</date>
      <distance>23</distance>
    </distance>
    <distance>
      <id_car>1</id_car>
      <date>20110903</date>
      <distance>0</distance>
    </distance>
    <distance>
      <id_car>2</id_car>
      <date>20110901</date>
      <distance>92</distance>
    </distance>
    <distance>
      <id_car>2</id_car>
      <date>20110902</date>
      <distance>87</distance>
    </distance>
    <distance>
      <id_car>2</id_car>
      <date>20110903</date>
      <distance>132</distance>
    </distance>
  </distances>
</output>

Это вывод xml:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<cars>
  <car>
    <id>1</id> 
    <brand>Audi</brand>
    <type>A3</type>
    <license>B-01-TST</license>
    <distances>
      <distance day="20110901">111</distance>
      <distance day="20110902">23</distance>
      <distance day="20110903">0</distance>
    </distances>
  </car>
  <car>
    <id>2</id>
    <brand>Volkwagen</brand>
    <type>Golf</type>
    <license>IF-02-TST</license>
    <distances>
      <distance day="20110901">92</distance>
      <distance day="20110902">87</distance>
      <distance day="20110903">132</distance>
    </distances>
  </car>
</cars>

и конец для элемента автомобилей в конце, я забыл.

Спасибо.

1 Ответ

2 голосов
/ 19 января 2012

Это довольно легко сделать с помощью XSLT; самая сложная часть - это использование ключей. Вот код, который вам нужен:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:key name="distances" match="distance" use="id_car" />

  <xsl:template match="output">
    <xsl:apply-templates select="cars" />
  </xsl:template>

  <xsl:template match="car">
    <xsl:copy>
      <xsl:apply-templates />
      <distances>
        <xsl:apply-templates select="key('distances', id)" />
      </distances>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="distance">
    <distance day="{date}">
      <xsl:value-of select="distance" />
    </distance>
  </xsl:template>

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

Ключ, по сути, позволяет использовать функцию key для получения списка всех distance элементов с id_car заданного значения.

Первый шаблон обрабатывает корень и выводит только элемент cars.

Второй шаблон обрабатывает любые элементы car, выводя их в точности так, как они есть, но добавляя элемент distances и используя функцию key, обрабатывает любые элементы distance с правильным идентификатором .

Последний шаблон - это шаблон «идентичности», который копирует все элементы, которые мы еще не учли, в точности так, как они есть; это обрабатывает элементы brand, type, license и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...