【问题标题】:xsl:choose if a variable is a file or a folderxsl:选择变量是文件还是文件夹
【发布时间】:2020-02-09 09:57:02
【问题描述】:

我喜欢检查我的 $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
-------------

【问题讨论】:

    标签: html xslt


    【解决方案1】:

    您认为文件名总是包含“.”的理论和目录名称当然不是完全错误的,但如果您对 90% 的时间都有效的东西感到满意,那么对于您的目的来说它可能是可以的。文件扩展名告诉你它是什么类型的文件也是错误的:这取决于媒体类型(MIME 类型),而不是扩展名。

    如果您正在查看本地文件(不同于 HTTP 资源),请考虑使用 EXPath 文件模块中的扩展函数(如果您的处理器支持)。请参阅 http://expath.org/spec/file - 特别是 file:is-file()file:is-dir()

    【讨论】:

      【解决方案2】:

      这样就解决了。我意识到目录没有大小。

       <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>
      

      【讨论】:

        【解决方案3】:

        如果您可以通过点的外观来区分文件/文件夹的差异,您可以应用以下 XSLT-1.0 样式表:

        • 它使用递归模板来获取最后一个/之后的字符串。
        • 然后它检查这个字符串是否包含.

        因此,对于这样的示例 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>  
        

        结果是一样的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-07-13
          • 1970-01-01
          • 2011-03-27
          • 2023-03-16
          • 2017-10-22
          • 2012-05-28
          • 2017-02-11
          • 1970-01-01
          相关资源
          最近更新 更多