我有以下输入XML:
<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循环中放入substring-after(它会抛出一个错误,因为你可以在多个字符串之后执行一个子字符串-after一旦)。这意味着我只能获得整个@src属性的不同值(不是句点后的字符串)。所以我的输出目前看起来像这样:
jpg|jpg|gif
我非常感谢一个简单的XSLT 2.0解决方案,使我能够做到这一点。
非常感谢您提前的时间 - 真的很感激。
答案 0 :(得分:5)
在XSLT 2.0中,您应该可以这样做....
<xsl:for-each select="distinct-values(descendant::img/(substring-after(@src, '.')))">
那应该只返回“jpg”和“gif”。
更好的是,完全取消 xsl:for-each ,然后执行此操作
<xsl:value-of select="distinct-values(descendant::img/(substring-after(@src, '.')))"
separator="|" />
当然,这假设您的所有文件名都只有一个.
。文件名如“my.file.gif”会导致问题。