2011-08-12 89 views
2

无法计算出计算并返回actor的名称的简单XSLT循环。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']"/> 

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

+0

好问题,1。看到我的答案是最简单的解决方案。请注意,不需要使用单个明确的条件XSLT指令或任何'xsl:for-each'。 :) –

回答

2

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

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

您可能需要检查最后一个** star **节点,以防止将不必要的逗号放在最后。 –

+0

@Tim - 好点。检查已添加。 – Oded

1

您可以使用重复指令(没有关于任何性能的担心):

<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 
1

这可能是最简单的一次转变 - 注意,既不需要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 
+0

+1因为有内置的规则 –