xsl: выберите, является ли переменная файлом или папкой - PullRequest
0 голосов
/ 12 октября 2019

Мне нравится проверять, является ли моя переменная $ name файлом или папкой. Я хотел бы использовать разные значки. Что-то вроде заявления if / then. Я думаю, что если $ name имеет расширение, то это файл.

Как проверить, имеет ли $ name расширение и какое расширение?

------------------
  if ${name} is a file then
    if ${name} has an rpm extension then
     <tr><td><img src='/.icons/rpm.gif' alt='[DIR]' width='16' height='16' /></td><td><a href='{$name}'><xsl:value-of select='.'/></a></td><td><xsl:value-of select='$date'/></td><td align='right'><xsl:value-of select='$size'/></td></tr>
    else
     <tr><td><img src='/.icons/file.gif' alt='[DIR]' width='16' height='16' /></td><td><a href='{$name}'><xsl:value-of select='.'/></a></td><td><xsl:value-of select='$date'/></td><td align='right'><xsl:value-of select='$size'/></td></tr>
   ifelse
     <tr><td><img src='/.icons/folder.gif' alt='[DIR]' width='16' height='16' /></td><td><a href='{$name}'><xsl:value-of select='.'/></a></td><td><xsl:value-of select='$date'/></td><td align='right'><xsl:value-of select='$size'/></td></tr>
  fi
 fi
-------------

Ответы [ 3 ]

1 голос
/ 12 октября 2019

Ваша теория, что имена файлов всегда включают "."И имена каталогов, конечно, не совсем неправильные, хотя, если вы довольны чем-то, что работает 90% времени, тогда это может быть в порядке для ваших целей. Также неправильно, что расширение имени файла говорит вам, какой это тип файла: это зависит от типа носителя (MIME-тип), а не от расширения.

Если вы смотрите на локальные файлы (в отличие отРесурсы HTTP) рассмотрите возможность использования функций расширения в файловом модуле EXPath, если ваш процессор их поддерживает. См. http://expath.org/spec/file - в частности file:is-file() и file:is-dir().

0 голосов
/ 12 октября 2019

Это решает это. Я понял, что каталоги не имеют размера.

 <xsl:choose>
     <xsl:when test="($size = '')">
         <tr><td><img src='/.icons/folder.gif' alt='[DIR]' width='16' height='16' /></td><td><a href='{$name}'><xsl:value-of select='.'/></a></td><td><xsl:value-of select='$date'/></td><td align='right'><xsl:value-of select='$size'/></td></tr>
     </xsl:when>
     <xsl:when test="(contains($name, '.rpm'))">
         <tr><td><img src='/.icons/rpm.png' alt='[   ]' width='16' height='16' /></td><td><a href='{$name}'><xsl:value-of select='.'/></a></td><td><xsl:value-of select='$date'/></td><td align='right'><xsl:value-of select='$size'/></td></tr>
     </xsl:when>
     <xsl:otherwise>
          <tr><td><img src='/.icons/unknown.gif' alt='[   ]' width='16' height='16' /></td><td><a href='{$name}'><xsl:value-of select='.'/></a></td><td><xsl:value-of select='$date'/></td><td align='right'><xsl:value-of select='$size'/></td></tr>
     </xsl:otherwise>
 </xsl:choose>
0 голосов
/ 12 октября 2019

Если вы можете различить разницу между файлами и папками по внешнему виду точек, вы можете применить следующую таблицу стилей 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>  

. результат тот же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...