xslt检查字母数字字符

时间:2013-10-30 09:50:24

标签: xml xslt

我想检查一个字符串是否只包含字母数字字符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>

1 个答案:

答案 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中找到。