Это короткое и простое преобразование использует и переопределяет правило идентификации :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"property[@name='ExternalList']
/listItem[@name='ExtElement2']
/property[@name='InternalList1']
">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:attribute name="length">
<xsl:value-of select="@length+1"/>
</xsl:attribute>
<xsl:apply-templates/>
<listItem name="SomeElement3" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
при применении к предоставленному документу XML:
<section name="SomeSection">
<!-- list property -->
<property length="2" name="ExternalList">
<!-- first element of external list -->
<listItem name="ExtElement1">
<property length="3" name="InternalList1">
<listItem name="SomeElement1" />
<listItem name="SomeElement2" />
<listItem name="SomeElement3" />
</property></listItem>
<!-- second element of external list -->
<listItem name="ExtElement2">
<property length="2" name="InternalList1">
<listItem name="SomeElement1" />
<listItem name="SomeElement2" />
</property></listItem>
</property>
</section>
желаемый, правильный результат получается :
<section name="SomeSection"><!-- list property -->
<property length="2" name="ExternalList"><!-- first element of external list -->
<listItem name="ExtElement1">
<property length="3" name="InternalList1">
<listItem name="SomeElement1"/>
<listItem name="SomeElement2"/>
<listItem name="SomeElement3"/>
</property>
</listItem><!-- second element of external list -->
<listItem name="ExtElement2">
<property length="3" name="InternalList1">
<listItem name="SomeElement1"/>
<listItem name="SomeElement2"/>
<listItem name="SomeElement3"/>
</property>
</listItem>
</property>
</section>
Примечание: Абсолютно никакие условные инструкции XSLT нигде в этом решении не используются - они вообще не нужны.