Это довольно легко сделать с помощью 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
и т. д.