Чтобы избежать дублирования кода, вы можете использовать именованные шаблоны, содержащие код для рендеринга тега img
<xsl:template name="img">
<img src="{@src}" />
</xsl:template>
Вы можете назвать это так
<xsl:call-template name="img" />
Итак, готовый XSLT будет
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/Image ">
<xsl:choose>
<xsl:when test="@href">
<a href="{@href}">
<xsl:call-template name="img" />
</a>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="img" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="img">
<img src="{@src}" />
</xsl:template>
</xsl:stylesheet>
Несмотря на то, что у вас по-прежнему есть две команды xsl: call-template , любые изменения в отображении тега img теперь необходимо выполнять только в одном месте. Вы также можете вызвать этот шаблон из любого места в вашем XSLT, предполагая, что текущий узел - это узел image .