XSL模板 - 减少复制

时间:2010-03-15 10:39:01

标签: xml xslt

对于极其模糊的问题标题(欢迎任何改进建议)

抱歉

我有一个XSL文档,目前有很多我希望减少的复制。

以下是我正在使用的以下XML代码段

<Unit Status="alive"> 

我目前正在使用以下XSL根据Unit的状态显示图像

  <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 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

这是“查找”问题的典型示例。一个有效的解决方案是使用单独的查找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" />