根据字符串的结尾显示不同的xsl:属性

时间:2010-04-30 09:15:53

标签: xslt xpath

我在xsl文档中有以下xsl代码

                <A target="_blank" style="text-decoration=none">
                    <xsl:attribute name="href">viewdoc.aspx?doc=<xsl:value-of select="URLFilePath"/>&amp;mode=inline</xsl:attribute>
                        <xsl:attribute name="prefix"><xsl:value-of select="FileName"/>: </xsl:attribute>
          <IMG src="images/word_small.gif" border="0"/>
                </A>

在代码隐藏中我正在做这个

            newItemNode = xmlDocument.CreateElement("URLFilePath")
            newItemNode.InnerText = correctedPath
            xmlItemNode.ParentNode.AppendChild(newItemNode)

现在适用于word文档。但是我需要在代码中检查文件的扩展名,并根据If语句显示正确的Image和xsl:属性。

所以If语句将是这样的: -

            If correctedPath.ToLower.Contains(".doc") Then
                 //display the word icon and attributes
            Else
                 //display the excel icon and attributes
            End If

你能否告诉我如何实现这一目标的一些提示和帮助?

由于

4 个答案:

答案 0 :(得分:2)

仅使用contains()通常可能会产生错误的结果(请参阅测试XML文档)。

ends-with()函数是必需的,它是XPath 2.0中的标准函数,可以在XSLT 1.0中实现,如下面的转换:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="URLFilePath">
   <xsl:variable name="visDoc">
    <xsl:call-template name="ends-with">
     <xsl:with-param name="pEnding" select="'.doc'"/>
    </xsl:call-template>
   </xsl:variable>
   <xsl:variable name="visXls">
    <xsl:call-template name="ends-with">
     <xsl:with-param name="pEnding" select="'.xls'"/>
    </xsl:call-template>
   </xsl:variable>

   <xsl:choose>
     <xsl:when test="$visDoc=1">word_small.gif</xsl:when>
     <xsl:when test="$visXls=1">xls_small.gif</xsl:when>
     <xsl:otherwise>unknown_small.gif</xsl:otherwise>
   </xsl:choose>
 </xsl:template>

 <xsl:template name="ends-with">
   <xsl:param name="pEnding"/>

   <xsl:value-of select=
    "number(substring(.,
                      string-length() -string-length($pEnding) +1
                      )
    =
     $pEnding
            )
    "/>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于以下测试XML文档

<files>
 <URLFilePath>myFile.doc</URLFilePath>
 <URLFilePath>myFile.xls</URLFilePath>
 <URLFilePath>myFile.xls.doc</URLFilePath>
 <URLFilePath>myFile.doc.xls</URLFilePath>
</files>

产生了正确的结果

 word_small.gif
 xls_small.gif
 word_small.gif
 xls_small.gif

请注意仅使用contains()会产生错误的结果。

答案 1 :(得分:0)

我设法找到了解决方案!很抱歉迟到的回复,但必须处理其他事情

以下是代码: -

                <A target="_blank" style="text-decoration=none">
          <xsl:choose>
            <xsl:when test="contains(., '.doc')">
              <xsl:attribute name="href">viewdoc.aspx?doc=<xsl:value-of select="URLFilePath"/>&amp;mode=inline
              </xsl:attribute>
                <xsl:attribute name="prefix">
                  <xsl:value-of select="FileName"/>:
                </xsl:attribute>
              <IMG src="images/word_small.gif" border="0"/>
            </xsl:when>
            <xsl:when test="contains(., '.xls')">
              <xsl:attribute name="href">viewxls.aspx?doc=<xsl:value-of select="URLFilePath"/>&amp;mode=inline
              </xsl:attribute>
                <xsl:attribute name="prefix">
                  <xsl:value-of select="FileName"/>:
                </xsl:attribute>
              <IMG src="images/excel_small.gif" border="0"/>
            </xsl:when>
          </xsl:choose>
                </A>

感谢所有帮助人员,非常感谢!

答案 2 :(得分:0)

一个迟到的回复,但我找到两个答案,处理匹配字符串的结尾与XSLT 1.0,非常优雅:

去给他们+1

答案 3 :(得分:-2)

如果需要,可以在您的XSLT文档中完全执行此操作。要显示图像,可以使用xsl:choose语句来测试URLFilePath元素

<xsl:choose>
   <xsl:when test="contains(., '.doc')">
      <IMG src="images/word_small.gif" border="0"/> 
   </xsl:when> 
   <xsl:when test="contains(., '.xls')">
      <IMG src="images/excel_small.gif" border="0"/> 
   </xsl:when> 
</xsl:choose>

如果您想要检查后面的代码,可以随时为URLFilePath元素添加额外的属性。

imageAttr = xmlDocument.CreateAttr("image")     
If correctedPath.ToLower.Contains(".doc") Then
    imageAttr.value = "images/word_small.gif"
Else
    imageAttr.value = "images/excel_small.gif"
End If
newItemNode.AppendChild(imageAttr) 

然后,在xls中,您可以简单地使用此属性来设置图像的源属性

<IMG border="0"> 
   <xsl:attribute name="src"><xsl:value-of select='@image' /></xsl:attribute>
</IMG>