XSLT:Foreach迭代每个项目,但显示第一个项目的值?

时间:2009-05-09 21:20:31

标签: xslt foreach

我有一个项目列表,我希望每个项目都成为一个网址。

列表:

 <root>
   <tags>
     <tag>open source</tag>
     <tag>open</tag>
     <tag>advertisement</tag>
     <tag>ad</tag>
   </tags>
 </root>

XSLT:

<xsl:template match="*">
    <div class="tags">
      <xsl:for-each select="/post/tags/tag">
          <a href="#">
            <xsl:value-of select="//tag"/>
          </a>
      </xsl:for-each>
    </div>
</xsl:template>

输出:

  <div class="tags"> 
    <a href="#">open source</a> 
    <a href="#">open source</a> 
    <a href="#">open source</a> 
    <a href="#">open source</a> 
  </div> 

我做错了什么?

2 个答案:

答案 0 :(得分:5)

更多XSLT做正确事情的方法是添加“标记”模板并修改原文:

<xsl:template match="*">
    <div class="tags">
        <xsl:apply-templates select="tag" />
    </div>
</xsl:template>

<xsl:template match="tag">
      <a href="#">
        <xsl:value-of select="."/>
      </a>
</xsl:template>

答案 1 :(得分:4)

您正在使用表达式值执行的操作是选择xml文档中的所有标记节点:

<xsl:value-of select="//tag"/>

这样做的结果是只有第一个选定的节点将用于该值。

您可以改用以下内容:

<xsl:value-of select="."/>

其中select =“。”将从for-each中选择当前节点。