Display different xsl: attributes depending on line ending

I have the following xsl code in xsl document

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

      

and in the code behind me i do this

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

      

This is now great for text documents. However, I need a way of code to check the file extension and display the correct Image and xsl: attribute depending on the If statement.

So the If statement will look like this: -

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

      

Could you please give me some advice and help on how I can achieve this?

thanks

+2


a source to share


4 answers


Simple use contains()

can usually lead to incorrect results
(see test XML document).

A function is required that is standard in XPath 2.0 and can be implemented in XSLT 1.0, as in the following transformation: ends-with()

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

      

When this transformation is applied to the following test XML document :



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

      

the correct result is generated :

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

      

Please note that using only contains()

produces incorrect results.

+2


a source


I managed to find a solution! Sorry for the late answer, but I had to work on something else.

Here is the code: -



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

      

Thanks for your help guys, really appreciate!

0


a source


Late answer, but I ended up in two answers that are about end-of-line matching with XSLT 1.0 and are very elegant:

go give them +1

0


a source


This can be done exclusively in your XSLT document if you need to. To display the image, you can use the xsl: select statement which checks the URLFilePath element

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

      

If you want to do this check in the code behind, you can always add additional attributes to your URLFilePath element.

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) 

      

And then, in your xls, you can just use this attribute to set the original image attribute

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

      

-2


a source







All Articles