对于极其模糊的问题标题(欢迎任何改进建议)
抱歉我有一个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>
如何将此代码放在模板或样式表中,以便我可以在任何地方停止复制/粘贴?
答案 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" />