Эта таблица стилей:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="subsection">
<subsection label="{heading/@label}" name="{heading/line}">
<xsl:apply-templates select="@*|node()"/>
</subsection>
</xsl:template>
<xsl:template match="section">
<section name="{heading/line}">
<xsl:apply-templates select="@*|node()"/>
</section>
</xsl:template>
</xsl:stylesheet>
Выход:
<section name="A Heading">
<heading>
<line absolutePage="4" page="2" num="35">A Heading</line>
</heading>
<subsection label="3" name="A Subheading" type="type1">
<heading label="3">
<line absolutePage="4" page="2" num="36">A Subheading</line>
</heading>
<content></content>
</subsection>
</section>
Примечание : Если возможно использование буквальных элементов результата и шаблона значений атрибутов, используйте его. Это делает код компактным и быстрым. Если вам нужен более общий ответ, уточните, пожалуйста.
Редактировать : Пропущено section/@name
. Конечно, если пустая строка section/@label
вас не беспокоит, вы можете использовать section|subsection
сопоставление с образцом.