Вот образец таблицы стилей [отредактирован, чтобы отразить новое требование с элементом веса]:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<xsl:template match="products">
<xsl:copy>
<product>
<xsl:apply-templates select="product/*"/>
</product>
</xsl:copy>
</xsl:template>
<xsl:template match="product/*">
<xsl:copy>
<value>
<xsl:value-of select="."/>
</value>
<unit></unit>
</xsl:copy>
</xsl:template>
<xsl:template match="product/weight" priority="3">
<xsl:copy>
<value>
<xsl:value-of select="translate(., 'abcdefghijklmnopqrstuvwxyz', '')"/>
</value>
<unit>
<xsl:value-of select="translate(., '0123456789', '')"/>
</unit>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Когда я применяю это к вводу образца
<products>
<product>
<name>abc</name>
<id>1</id>
</product>
<product>
<name>klm</name>
<id>2</id>
</product>
<product>
<name>foo</name>
<id>3</id>
<weight>10lbs</weight>
</product>
</products>
Я получаю
<products>
<product>
<name>
<value>abc</value>
<unit/>
</name>
<id>
<value>1</value>
<unit/>
</id>
<name>
<value>klm</value>
<unit/>
</name>
<id>
<value>2</value>
<unit/>
</id>
<name>
<value>foo</value>
<unit/>
</name>
<id>
<value>3</value>
<unit/>
</id>
<weight>
<value>10</value>
<unit>lbs</unit>
</weight>
</product>
</products>
Исходя из комментария Алехандро, я мог неправильно прочитать желаемый результат, и вы не хотите объединять продукты, в этом случае используйте
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="product/*">
<xsl:copy>
<value>
<xsl:value-of select="."/>
</value>
<unit></unit>
</xsl:copy>
</xsl:template>
<xsl:template match="product/weight" priority="3">
<xsl:copy>
<value>
<xsl:value-of select="translate(., 'abcdefghijklmnopqrstuvwxyz', '')"/>
</value>
<unit>
<xsl:value-of select="translate(., '0123456789', '')"/>
</unit>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
, тогда вы получите
<products>
<product>
<name>
<value>abc</value>
<unit/>
</name>
<id>
<value>1</value>
<unit/>
</id>
</product>
<product>
<name>
<value>klm</value>
<unit/>
</name>
<id>
<value>2</value>
<unit/>
</id>
</product>
<product>
<name>
<value>foo</value>
<unit/>
</name>
<id>
<value>3</value>
<unit/>
</id>
<weight>
<value>10</value>
<unit>lbs</unit>
</weight>
</product>
</products>