Вы можете избежать этого повторения, полностью осознав внутреннюю красоту XSLT.
Используйте функцию шаблона, как показано в следующем примере:
Сократите центральный шаблон до его основных:
<xsl:template match="/">
<html>
<head>
<title>bar</title>
</head>
<body>
<xsl:apply-templates />
</body>
</html>
</xsl:template>
И добавить два подшаблона, реализующих последнее условие IF
для гипотетического корневого элемента <root>
(его имя должно совпадать с именем корневого элемента XML)
<xsl:template match="root">
<xsl:call-template name="generic" />
</xsl:template>
<xsl:template match="root[$varYouMightFigureOut > 1]">
<ol>
<xsl:apply-templates />
</ol>
</xsl:template>
Затем сведите две возможности xsl:choose
к этим двум шаблонам:
<xsl:template match="something/something2[string-length($foo)=0]">
<li>
<xsl:call-template name="generic" />
</li>
</xsl:template>
<xsl:template match="something/something2[tmp = $foo]">
<li>
<xsl:call-template name="generic" />
</li>
</xsl:template>
(Вы можете добавить параметры к xsl:call-template
при необходимости).
И дополните его «универсальным» шаблоном-заполнителем, используемым вышеупомянутыми шаблонами:
<xsl:template name="generic">
<xsl:value-of select="normalize-space(.)" />
</xsl:template>
Это решение исключает все ненужные повторения и использует мощь XSLT.