Шаблон XSL - сокращение репликации - PullRequest
2 голосов
/ 15 марта 2010

Извините за крайне расплывчатое название вопроса (любые предложения по улучшению приветствуются)

У меня есть документ XSL, у которого в настоящее время много репликации, которую я хочу уменьшить.

Вот следующий фрагмент XML, с которым я работаю

<Unit Status="alive"> 

В настоящее время я использую следующий XSL для показа изображений в зависимости от состояния устройства

  <xsl:choose>
    <xsl:when test="@Status = 'alive'">
      <img src="/web/resources/graphics/accept.png" />
    </xsl:when>
    <xsl:when test="@Status = 'missingUnit'">
      <img src="/web/resources/graphics/error.png" />
    </xsl:when>
    <xsl:when test="@Status = 'missingNode'">
      <img src="/web/resources/graphics/exclamation.png" />
    </xsl:when>
    <xsl:when test="@Status = 'unexpectedUnit'">
      <img src="/web/resources/graphics/exclamation_blue.png" />
    </xsl:when>
    <xsl:otherwise>
      <!-- Should never get here -->
      <img src="/web/resources/graphics/delete.png" />
    </xsl:otherwise>
  </xsl:choose>

Как поместить этот код в шаблон или таблицу стилей, которые позволят мне прекратить копировать / вставлять это везде?

Ответы [ 2 ]

5 голосов
/ 15 марта 2010
   <xsl:variable name="graphicspath">/web/resources/graphics</xsl:variable>

   <xsl:template match="/Unit">
      <xsl:call-template name="status">
         <xsl:with-param name="Status" select="./@Status" />
      </xsl:call-template>
   </xsl:template>

   <xsl:template name="status">
      <xsl:param name="Status" />
      <xsl:choose>
         <xsl:when test="$Status = 'alive'">
            <img src="{$graphicspath}/accept.png" />
         </xsl:when>
         <xsl:when test="$Status = 'missingUnit'">
            <img src="{$graphicspath}/error.png" />
         </xsl:when>
         <xsl:when test="$Status = 'missingNode'">
            <img src="{$graphicspath}/exclamation.png" />
         </xsl:when>
         <xsl:when test="$Status = 'unexpectedUnit'">
            <img src="{$graphicspath}/exclamation_blue.png" />
         </xsl:when>
         <xsl:otherwise>
            <!-- Should never get here -->
            <img src="{$graphicspath}/delete.png" />
         </xsl:otherwise>
      </xsl:choose>
   </xsl:template>
2 голосов
/ 15 марта 2010

Это классический пример проблемы «поиска» . Одним из эффективных решений является использование отдельного поискового XML-документа и поиск / индексирование его с помощью key () / <xsl:key/>:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="my:way"
 exclude-result-prefixes="my"
 >
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:variable name="vStatus" select="*/@Status"/>

 <xsl:key name="kImageForStatus"
  match="@image" use="../@status"/>

 <my:dict>
   <when status="alive" image="accept"/>
   <when status="missingUnit" image="error"/>
   <when status="missingNode" image="exclamation"/>
   <when status="unexpectedUnit" image="exclamation_blue"/>
 </my:dict>

 <xsl:variable name="vLookup"
  select="document('')/*/my:dict[1]"/>

    <xsl:template match="/">
      <xsl:variable name="vImage">
          <xsl:for-each select="$vLookup">
            <xsl:value-of select="key('kImageForStatus', $vStatus)"/>
         </xsl:for-each>
     </xsl:variable>

       <img src="/web/resources/graphics/{$vImage}.png" />
    </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к первоначально предоставленному документу XML:

<Unit Status="alive"/>

желаемый результат получен :

<img src="/web/resources/graphics/accept.png" />

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