0

我想检查一个字符串是否只包含字母数字字符或“。”

这是我的代码。但它只有在 $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>
4

1 回答 1

2

我想检查一个字符串是否只包含字母数字字符或“。”

那将是

<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) 可以在我较早的答案中找到。

于 2013-10-30T10:15:38.677 回答