我想检查一个字符串是否只包含字母数字字符OR'。'
这是我的代码。但它只有在$ value完全匹配$ allowed-characters时才有效。我使用xslt 1.0。
<xsl:template name="GetLastSegment">
<xsl:param name="value" />
<xsl:param name="separator" select="'.'" />
<xsl:variable name="allowed-characters">ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.</xsl:variable>
<xsl:choose>
<xsl:when test="contains($value, $allowed-characters)">
<xsl:call-template name="GetLastSegment">
<xsl:with-param name="value" select="substring-after($value, $separator)" />
<xsl:with-param name="separator" select="$separator" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$value" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
答案 0 :(得分:2)
我想检查一个字符串是否只包含字母数字字符OR'。'
那将是
<xsl:when test="string-length(translate($value, $allowed-characters, '')) = 0">
<!-- ... -->
</xsl:when>
或
<xsl:when test="translate($value, $allowed-characters, '') = ''">
<!-- ... -->
</xsl:when>
或者,FWIW甚至
<xsl:when test="not(translate($value, $allowed-characters, ''))">
<!-- ... -->
</xsl:when>
因为空字符串的计算结果为false
。不过,我认为后一种变体在生产代码中使用它太“聪明”了。除非你做这样的事情:
<xsl:variable name="disallowed-characters" select="translate($value, $allowed-characters, '')" />
<xsl:when test="not($disallowed-characters)">
<!-- ... -->
</xsl:when>
通用substring-after-last
函数如下所示:
<xsl:template name="substring-after-last">
<xsl:param name="string1" select="''" />
<xsl:param name="string2" select="''" />
<xsl:if test="$string1 != '' and $string2 != ''">
<xsl:variable name="head" select="substring-before($string1, $string2)" />
<xsl:variable name="tail" select="substring-after($string1, $string2)" />
<xsl:variable name="found" select="contains($tail, $string2)" />
<xsl:if test="not($found)">
<xsl:value-of select="$tail" />
</xsl:if>
<xsl:if test="$found">
<xsl:call-template name="substring-before-last">
<xsl:with-param name="string1" select="$tail" />
<xsl:with-param name="string2" select="$string2" />
</xsl:call-template>
</xsl:if>
</xsl:if>
</xsl:template>
相反(substring-before-last
)可以在earlier answer of mine中找到。