match="@*|node()"
File: Data.xml <chapter> <para>para1</para> <figure> <title>title 1</title> <graphic fileref="pic1.jpg" /> </figure> <para>para2</para> <sect1> <para>para3</para> <figure> <title>"He Lights"</title> <graphic fileref="pic2.jpg" /> </figure> <para>line 1</para> <sect2> <para>line 2</para> <figure> <title>title 2</title> <graphic fileref="pic1.jpg" /> </figure> </sect2> </sect1> </chapter> File: Transform.xslt <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" omit-xml-declaration="yes" /> <xsl:template match="chapter | sect1 | sect2"> <xsl:copy> <xsl:attribute name="uid"> <xsl:value-of select="generate-id(.)" /> </xsl:attribute> <xsl:apply-templates select="@*|node()" /> </xsl:copy> </xsl:template> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()" /> </xsl:copy> </xsl:template> </xsl:stylesheet> Output: <chapter uid="d2e1"> <para>para1</para> <figure> <title>title 1</title> <graphic fileref="pic1.jpg"/> </figure> <para>para2</para> <sect1 uid="d2e17"> <para>para3</para> <figure> <title>"He Lights"</title> <graphic fileref="pic2.jpg"/> </figure> <para>line 1</para> <sect2 uid="d2e33"> <para>line 2</para> <figure> <title>title 2</title> <graphic fileref="pic1.jpg"/> </figure> </sect2> </sect1> </chapter>