【问题标题】:simple loop in xsltxslt中的简单循环
【发布时间】:2011-08-12 21:07:38
【问题描述】:

无法找出一个简单的 XSLT 循环来计算并返回参与者的姓名。

<stars>
  <star ID="001">Leonardo DiCaprio</star>
  <star ID="002">Matt Damon</star>
  <star ID="003">Jack Nicholson</star>
</stars>

这是我为得到我想要的结果而做的,但如果有第四个或第五个演员,我需要添加到代码中。

<xsl:value-of select="stars/star[@ID='001']"/>
<xsl:text>, </xsl:text>
<xsl:value-of select="stars/star[@ID='002']"/>
<xsl:text>, </xsl:text>
<xsl:value-of select="stars/star[@ID='003']"/>

基本上我需要循环来显示用逗号分隔的星星的名称。任何帮助表示赞赏。

【问题讨论】:

  • 好问题,+1。请参阅我的答案以获得最简单的解决方案。请注意,不需要使用单个显式条件 XSLT 指令或任何 xsl:for-each。 :)

标签: xslt loops


【解决方案1】:

使用模板而不是循环。 XSLT 处理器针对模板匹配进行了优化。

<xsl:template match="star">
  <xsl:value-of select="." />
  <xsl:if test="position() != last()">
    <xsl:text>, </xsl:text>
  </xsl:if>
</xsl:template>

【讨论】:

  • 您可能需要检查最后一个 star 节点,以防止在末尾添加不必要的逗号。
【解决方案2】:

您可以使用重复指令(无需担心性能):

<xsl:template match="stars">
    <xsl:value-of select="star[1]"/>
    <xsl:for-each select="star[position()>1]">
        <xsl:value-of select="concat(', ',.)"/>
    </xsl:for-each>
</xsl:template>

得到:

Leonardo DiCaprio, Matt Damon, Jack Nicholson 

【讨论】:

    【解决方案3】:

    这可能是最简单的转换之一——请注意,既不需要xsl:for-each,也不需要任何显式的 XSLT 条件指令

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output method="text"/>
     <xsl:strip-space elements="*"/>
    
     <xsl:template match="star[position() >1]">
      <xsl:text>, </xsl:text><xsl:apply-templates/>
     </xsl:template>
    </xsl:stylesheet>
    

    应用于提供的源 XML 文档时

    <stars>
        <star ID="001">Leonardo DiCaprio</star>
        <star ID="002">Matt Damon</star>
        <star ID="003">Jack Nicholson</star>
    </stars>
    

    产生所需的正确输出

    Leonardo DiCaprio, Matt Damon, Jack Nicholson
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-19
      • 2014-01-15
      • 2017-09-20
      • 2016-05-24
      • 2014-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多