2015-03-12 3 views
0

С XSLT, я хотел бы преобразовать файл XML, который имеет следующую структуру:Удаление и копирование XML-элементов с помощью XSLT

<e1> 
    <e2 a="a1" b="b1" c="c1"> 
    <e3 foo="a"/> 
    <e3 foo="b"/> 
    <e3 foo="c"/> 
    ... 
    </e2> 
    <e2 a="a2" b="b2" c="c2"> 
    <e3 foo="d"/> 
    ... 
    </e2> 
    ... 
</e1> 

Into:

<e1> 
    <e2 a="a1" b="b1" c="c1"> 
    <e3 a="a1" b="b1" e="e"/> 
    </e2> 
    <e2 a="a2" b="b2" c="c2"> 
    <e3 a="a2" b="b2" e="e"/> 
    </e2> 
    ... 
</e1> 

В словах: мне нужно полностью удалите элементы e3 и замените их копией прилагаемого элемента e2, имя которого изменилось на e3; копирование некоторых атрибутов (например, a, b) в новый элемент и добавление некоторых новых атрибутов (например, e).

Все остальное должно оставаться в силе.

Заранее спасибо.

+0

Вопрос не совсем ясен. ** 1. ** Что вы подразумеваете под _substitute их с копией входящего e2-элемента с именем, измененным на e3_, потому что я все еще могу видеть элементы 'e2' и' e3' в вашем выходе. ** 2. ** Пожалуйста, укажите конкретные атрибуты, которые нужно скопировать, и не позволяйте нам что-то принять. –

+0

@LingamurthyCS, новый элемент e3 является копией прилагаемого элемента e2 с удаленными атрибутами, а некоторые добавлены. Атрибуты, которые нужно скопировать - как в примерах a, так и b, c удаляется, e добавляется. –

+0

Какие атрибуты вы хотите удалить и которые хотите добавить? –

ответ

3

Возможно, это может работать для вас:

XSLT 1,0

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

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

<xsl:template match="e2[e3]"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     <e3 a="{@a}" b="{@b}" e="e"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="e3"/> 

</xsl:stylesheet> 

Она удаляет все существующие e3 элементы и - для любого e2 элемента, который содержит, по меньшей мере, один e3 дочерний элемент - добавляет новый e3, копируя @a и @b атрибуты от родителя e2 и добавляя новый атрибут @e. Все остальное копируется as is.

Смежные вопросы