Отображать различные атрибуты xsl: в зависимости от окончания строки - PullRequest
2 голосов
/ 30 апреля 2010

У меня есть следующий код 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)

Теперь это прекрасно работает для текстовых документов. Однако мне нужен способ в коде проверить расширение файла и отобразить правильный Image и атрибут xsl: в зависимости от оператора If.

Таким образом, оператор If будет выглядеть так: -

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

Не могли бы вы дать мне несколько советов и помочь, как мне этого добиться?

Спасибо

Ответы [ 4 ]

2 голосов
/ 30 апреля 2010

Простое использование 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() дает неверные результаты.

0 голосов
/ 06 августа 2013

Поздний ответ, но я столкнулся с двумя ответами, которые касаются совпадения конца строки с XSLT 1.0 и очень элегантны:

иди дай им + 1

0 голосов
/ 10 мая 2010

Мне удалось найти решение! Извините за поздний ответ, но пришлось работать на что-то еще

Вот код: -

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

Спасибо за вашу помощь, ребята, очень благодарны!

0 голосов
/ 30 апреля 2010

Это может быть сделано исключительно в вашем документе 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...