首先,多次评估源元素是完全可能的。只需使用相同的选择器。
例如,考虑以下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>
但是它看起来像你真正想要的是循环一堆包含图像和标题的节点。 你可以使用一个for-each循环,以避免名称选择的节点:
<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>
没有足够的上下文。节点A和节点B是什么?我假设你显示的代码是所需的输出。输入是什么样的?你已经拥有了哪些XSLT(这不是一个“给我编码”的网站)。 –