$ 4xslt listing2.xml states-lookup-error.xslt
Ezra Pound of In stylesheet
file://dW/articles/xslt-lookup-defaults/states-lookup-error.xslt,
line 28, column 6:
A message instruction in the Stylesheet requested termination of processing:
Lookup error on key: ZZ
默认值
如果希望在查找失败的时候不报告错误,还可以设置一个默认值。使用的技术和错误通知类似,但不是发送停止消息,而是提供默认值。也可以将停止消息编码到查找表中。清单 3 中的例子为查找表中找不到的所有键提供了值 [UNKNOWN]。
清单 3. 带有默认值的查找表(states-lookup-default.xslt)
<?xml version="1.0"?>
<xsl:transform
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:s="http://example.com/states.data"
version="1.0"
>
<xsl:output method="text"/>
<xsl:key name="state-lookup" match="s:state" use="s:abbr"/>
<xsl:variable name="states-top" select="document('')/*/s:states"/>
<xsl:template match="label">
<xsl:value-of select="name"/>
<xsl:text> of </xsl:text>
<xsl:apply-templates select="$states-top">
<xsl:with-param name="curr-label" select="."/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="s:states">
<!-- This template updated to add a default value signal -->
<xsl:param name="curr-label"/>
<xsl:variable name="look-for" select="$curr-label/address/state"/>
<xsl:variable name="default" select="s:default"/>
<xsl:variable name="result"
select="key('state-lookup', $look-for)/s:name"/>
<xsl:choose>
<xsl:when test="$result">
<xsl:value-of select="$result"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$default"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<s:states>
<s:state><s:abbr>CO</s:abbr><s:name>Colorado</s:name></s:state>
<s:state><s:abbr>CT</s:abbr><s:name>Connecticut</s:name></s:state>
<s:state><s:abbr>ID</s:abbr><s:name>Idaho</s:name></s:state>
<s:state><s:abbr>NJ</s:abbr><s:name>New Jersey</s:name></s:state>
<!-- Added default value -->
<s:default><s:name>[UNKNOWN]</s:name></s:default>
</s:states>
</xsl:transform>
这里仍然要检查 key 函数的结果是否为空,但这里提供了一个默认值。这个值在查找表的一个特殊元素( s:states/s:default)中给出。
下面是 4XSLT 处理程序的输出结果:
$ 4xslt listing2.xml states-lookup-default.xslt
Ezra Pound of [UNKNOWN]
William Williams of New Jersey
结束语
这些细化措施可以使 XSLT 查找表更方便。您现在看到在确定这类代码的行为时有很大的灵活性,也许还希望有一种更好的方法将查找表打包以供重用。在基本的 XSLT 1.0 中不太容易做到这一点,但是将来考察 EXSLT(请参阅 参考资料)中的某些设施时,我还会探讨这个话题,那些工具可以使查找表更便于使用。






