LINUX.ORG.RU

[XSL] рекурсивное копирование потомков в новый элемент


0

1

Есть значит документ с элементами /data/abc и /data/def, в каждом из которых свой набор подэлементов. Нужно средствами XSL скопировать из /data/abc все содержимое (элементы и их аттрибуты) внутрь нового элемента, одновременно переделывая некоторые конструкции по заданным для них шаблонам (например, если встретился элемент element1 в любом месте /data/abc).
Первый вариант реализации был:

<xsl:template match="/">
	<something>
		<xsl:apply-templates select="/data/abc"/>
	</something>
</xsl:template>

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

<xsl:template match="element1">
...
</xsl:template>
Но из всего этого смущает то, что в вывод попадает сам /data/abc, что несколько излишне, поскольку нужны только его потомки.
Если сделать так
<xsl:template match="/data/abc">
	<something>
		<xsl:apply-templates select="*"/>
	</something>
</xsl:template>
то в вывод попадает весь /data, хотя и со всеми необходимыми преобразованиями.
Какую-то последнюю мелочь упускаю, но до сих пор не могу догадаться.

гуглить xslt identity tranformation и модифицировать его под свои нужны.

phoenix ★★★★
()

><xsl:apply-templates select=«/data/abc»/>

А может как-то <xsl:apply-templates select=«/data/abc/child()»> так?

Karapuz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.