Во-первых, вполне возможно оценить исходный элемент несколько раз. Просто используйте тот же селектор.
Например, с учетом следующего XML:
<images>
<node id="a" image="foo.png" caption="foo" />
<node id="b" image="bar.png" caption="bar" />
</images>
Этот XSLT будет повторно выводить материал с первого узла:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="images">
<div id="images">
<img><xsl:value-of select="node[@id='a']/@image"/></img>
<img><xsl:value-of select="node[@id='a']/@caption"/></img>
<img><xsl:value-of select="node[@id='a']/@image"/></img>
<img><xsl:value-of select="node[@id='a']/@caption"/></img>
</div>
</xsl:template>
Выход:
<div id="images">
<img>foo.png</img>
<img>foo</img>
<img>foo.png</img>
<img>foo</img>
</div>
Тем не менее, похоже, что вам действительно нужно перебрать кучу узлов, содержащих изображение и заголовок.
Вы можете использовать для каждого цикла , чтобы избежать выбора узлов по имени:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="images">
<div id="images">
<xsl:for-each select="node">
<img><xsl:value-of select="@image"/></img>
</xsl:for-each>
</div>
<div id="captions">
<xsl:for-each select="node">
<div><xsl:value-of select="@caption"/></div>
</xsl:for-each>
</div>
</xsl:template>
</xsl:stylesheet>
Который будет производить:
<div id="images">
<img>foo.png</img>
<img>bar.png</img>
</div>
<div id="captions">
<div>foo</div>
<div>bar</div>
</div>