XSLT 2.0:在for-each循环上执行Substring-after以获得不同的值



我有以下输入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循环中放入子字符串后(它会抛出一个错误,因为你不能一次对多个字符串执行子字符串后)。这意味着我只能获得整个@src属性的不同值(而不是句点后的字符串)。所以我的输出现在看起来像这样:

jpg|jpg|gif

如果有一个简单的XSLT 2.0解决方案使我能够做到这一点,我将非常感激。

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

在XSLT 2.0中,您应该能够这样做....

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

应该只返回"jpg"one_answers"gif"。

更好的是,完全去掉xsl:for-each,只执行

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

当然,这假设您的所有文件名中只有一个. in。像"my.file.gif"这样的文件名会引起问题。

最新更新