xml - XSLT 2.0 : Substring-after on a for-each loop to get distinct-values

标签 xml xslt

我有以下输入 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>

但是,我得到了重复的文件类型,因为我无法将 substring-after 放入 for-each 循环中(它会引发错误,因为您无法一次对多个字符串执行 substring-after )。这意味着我只能获取整个 @src 属性的不同值(而不是句点后面的字符串)。所以我的输出目前看起来像这样:

jpg|jpg|gif

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

非常感谢您提前抽出时间 - 非常感谢。

最佳答案

在 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”这样的文件名会导致问题。

关于xml - XSLT 2.0 : Substring-after on a for-each loop to get distinct-values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24435755/

相关文章:

xml - 使用 xsl 转换将 UML 图转换为规范 Z

c# - XPATH 为带有命名空间的 XML 返回 null

XSLT 1.0 将多个节点的值相加

xml - XML 中命名空间的需要

xml - XSLT 函数以 YYYYMMDD 格式验证日期

xml - XPath 中 != 和 not 有什么区别

php - 使用 PHP DOMDocument 将输出格式化为文件

java - JAXb(版本 2.2.8)以错误的格式编码 gmonth

xslt - XSL-FO 2.0 : Prevent page-break inside table

xml - xslt中count属性的范围是多少?