Как сделать так, чтобы пустые узлы в xml не отображались?
Если узлы выбираются 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>
Так?

/root/node/child[text()]