Если узлы выбираются XPath'ом, можно применять шаблон только к узлам с текстом
/path/to/node[text()]
или, если у него есть подэлементы, и берется все значение
/path/to/node[string(.)]
или, если шаблон применяется в ходе обхода дерева, а не через
select
или
for-each
, то можно, соответственно, в паттерне указать:
<xsl:template match="node[text()]">
...
</xsl:template>
или, если вы создаете новые узлы, и далее
apply-templates
, а потом оказывается, что ничего не вышло и элемент в результате пустой, то можно сначала
apply-templates
внутри переменной, а затем проверить, получилось ли что-нибудь:
<xsl:variable name="contents">
<xsl:apply-templates />
</xsl:variable>
<xsl:if test="string($contents)">
<MyElement>
<xsl:copy-of select="$contents" />
</MyElement>
</xsl:variable>