消除对字符串变量的不必要的XSL测试

时间:2014-06-11 16:44:44

标签: xml xslt xslt-1.0

我需要找到美国邮政编码在某个数字范围(130-160)之间的元素。

是否有一种更简单的方法可以在邮政编码的字符串值上编码此逻辑,而不是执行32“start-with(PostalCode,'103')”或.........:

<xsl:when test="starts-with(//Order/Address/PostalCode,'130')or starts-with(//Order/Address/PostalCode,'131')or starts-with(//Order/Address/PostalCode,'132')or starts-with(//Order/Address/PostalCode,'133')or starts-with(//Order/Address/PostalCode,'134')or starts-with(//Order/Address/PostalCode,'135')or starts-with(//Order/Address/PostalCode,'136')or starts-with(//Order/Address/PostalCode,'137')">

已经有&gt;超过300 xsl:选择:何时和:否则在这个怪物中划线,我写的没有一行评论。这种方式似乎错了。

2 个答案:

答案 0 :(得分:0)

好吧,如果你只是要查看前三位数,你可以先设置一个变量来保存前三位数

<xsl:variable name="zip" select="number(substring(//Order/Address/PostalCode, 1, 3))" />

然后检查范围变得简单

<xsl:choose>
    <xsl:when test="$zip >= 130 and $zip &lt;= 160">Hurrah!</xsl:when>

为了更灵活一点,你可以参数化......

<xsl:param name="first" select="130" />
<xsl:param name="last" select="160" />

然后你会使用这些参数:

<xsl:variable name="zip" select="number(substring(//Order/Address/PostalCode, 1, string-length($first)))" />
<xsl:choose>
   <xsl:when test="$zip >= $first and $zip &lt;= $last">

答案 1 :(得分:0)

您可以测试:

<xsl:variable name="subcode" select="substring(PostalCode, 1, 3)" />
<xsl:if test="130 &lt;= $subcode and $subcode &lt;= 160">
    <!-- result if true -->
</xsl:if>

但是,如果要查找满足此条件的元素,则应在谓词中使用它。