2014-06-26 40 views
1

我有以下输入XML:XSLT 2.0:上的for-each循环子串-后获得不同值

<img src="blah.jpg"/> 
<img src="blahh.jpg"/> 
<img src="blah.gif"/> 

我需要的文件类型的不同输出字符串,格式为:

jpg|gif 

我现有的样式表得到了一些方式:

<xsl:for-each select="distinct-values(descendant::img/@src)"> 
    <xsl:choose> 
     <xsl:when test="position()!=last()"> 
      <xsl:value-of select="concat(substring-after(.,'.'),'|')"/> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="substring-after(.,'.')"/> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:for-each> 

不过,我得到一个复制的文件类型,因为我不能把子字符串 - 在for-each循环之后(它会抛出一个错误,因为您无法执行子字符串 - 在多个字符串之后)。这意味着我只能获得整个@src属性的distinct-values(而不是句点之后的字符串)。所以我的输出目前看起来像这样:

jpg|jpg|gif 

我真的很感激一个简单的XSLT 2.0解决方案,使我能够做到这一点。

非常感谢您的时间提前 - 真的很感激它。

回答

4

在XSLT 2.0,你应该能够做到这一点....

<xsl:for-each select="distinct-values(descendant::img/(substring-after(@src, '.')))"> 

这应该只返回 “JPG” 与 “GIF”。

更妙的是,废除了的xsl:for-每个干脆,只是这样做

<xsl:value-of select="distinct-values(descendant::img/(substring-after(@src, '.')))" 
       separator="|" /> 

。当然,这是假定所有的文件名,只是在一个.文件名等。 “my.file.gif”会导致问题。

+0

这就是机票 - 非常感谢。 = D对于那些偶然发现同样问题的人,你需要从for-each中的两个值语句中删除substring-after(),否则你将不会得到输出。 – Aaron

+1

为了说明带有多个'.'的文件名,你可以'tokenize(@src,'。')[last()]'而不是substring-after。 –