Я бы предложил заменить весь фрагмент кода, который вы показали, следующим:
<xsl:apply-templates select="document('legal.xml')/legal" />
и добавить следующие шаблоны:
<xsl:template match="heading">
<h3><xsl:apply-templates /></h3>
</xsl:template>
<xsl:template match="g">
<p><xsl:apply-templates /></p>
</xsl:template>
<xsl:template match="foo">
<ul>
<xsl:apply-templates />
</ul>
</xsl:template>
<xsl:template match="bar">
<li><xsl:apply-templates /></li>
</xsl:template>
Причина, по которой вы получаете дубликаты вмомент в том, что вы перебираете каждый заголовок, а затем на каждой итерации этого цикла вы обрабатываете один и тот же элемент g
и перебираете те же самые элементы foo
, независимо от того, какой заголовок им нужен,Как в исходном коде, так и в выводе html, элементы g
/ p
не являются потомками элементов header
/ h3
, поэтому не имеет смысла рассматривать их как таковые в вашем коде.