Я думаю, что вы могли бы использовать ключ здесь для поиска ваших элементов узлов по атрибуту name
<xsl:key name="elements" match="element" use="@name" />
Во-первых, вам нужно будет сопоставить все ваши не элементы узлы, например
<xsl:apply-templates select="dummy/*[not(self::element)]" />
Затем, чтобы найти описание соответствующего элемент вы можете использовать ключ, установленный ранее
<xsl:apply-templates select="key('elements', local-name())"/>
В этом случае у вас будет два соответствующих шаблона для узлов element ;один для элемента узлов с описанием , и один для тех без.
Вот полный XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:key name="elements" match="element" use="@name"/>
<xsl:template match="/">
<table>
<xsl:apply-templates select="dummy/*[not(self::element)]"/>
</table>
</xsl:template>
<xsl:template match="*[not(self::element)]">
<tr>
<td>
<xsl:apply-templates select="key('elements', local-name())"/>
</td>
<td>
<xsl:value-of select="."/>
</td>
</tr>
</xsl:template>
<xsl:template match="element">
<xsl:value-of select="@name"/>
</xsl:template>
<xsl:template match="element[description[node()]]">
<xsl:value-of select="description"/>
</xsl:template>
</xsl:stylesheet>
Применительно к вашемуВ примере XML выводится следующий HTML-код:
<table>
<tr>
<td>abstract for L</td>
<td>2010</td>
</tr>
<tr>
<td>A</td>
<td>58.78</td>
</tr>
<tr>
<td>O</td>
<td>O</td>
</tr>
<tr>
<td>Description for Sd</td>
<td>1101</td>
</tr>
<tr>
<td>Some description for S</td>
<td>0.00</td>
</tr>
<tr>
<td>A</td>
<td>368.38</td>
</tr>
<tr>
<td>abstract for L</td>
<td>2009</td>
</tr>
<tr>
<td>Description for Sd</td>
<td>1103</td>
</tr>
</table>