Если вы можете различить разницу между файлами и папками по внешнему виду точек, вы можете применить следующую таблицу стилей XSLT-1.0:
- Он использует рекурсивный шаблон для получения строки послеlast
/
. - Затем он проверяет, содержит ли эта строка
.
Итак, для примера XML-файла, подобного этому:
<root>
<img src='/.icons/rpm.gif' alt='[DIR]' width='16' height='16' />
<img src='/.icons/file.gif' alt='[DIR]' width='16' height='16' />
<img src='/.icons/someDir' alt='[DIR]' width='16' height='16' />
<img src='/.icons/folder.gif' alt='[DIR]' width='16' height='16' />
<img src='/.icons/anotherDir' alt='[DIR]' width='16' height='16' />
</root>
XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" method="xml" indent="yes" />
<xsl:template match="/root/img">
<xsl:variable name="filename">
<xsl:call-template name="afterLastSlash">
<xsl:with-param name="str" select="@src" />
</xsl:call-template>
</xsl:variable>
<xsl:choose>
<xsl:when test="contains($filename,'.')">
<xsl:value-of select="'File'" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="'Directory'" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- get filename (string after last slash) -->
<xsl:template name="afterLastSlash">
<xsl:param name="str" />
<xsl:choose>
<xsl:when test="substring-after($str,'/') != ''">
<xsl:call-template name="afterLastSlash">
<xsl:with-param name="str" select="substring-after($str,'/')" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$str" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
дает следующий результат:
File
File
Directory
File
Directory
При использовании XSLT-2.0 или выше таблица стилей может быть уменьшена до
<xsl:template match="/root/img">
<xsl:choose>
<xsl:when test="contains(replace(@src,'(.+/)?(.+)','$2'),'.')">
<xsl:value-of select="'File'" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="'Directory'" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
. результат тот же.