是否有“优雅”的方法来测试属性值以字母开头?

时间:2011-05-12 21:43:13

标签: xslt xpath

我需要测试attibute值是否以字母开头。如果不是,我将用“ID_”作为前缀,因此它将是一个有效的id类型的属性值。 我目前有以下内容(测试该值不以数字开头 - 我知道这些属性值只会以字母或数字开头),但我希望有更优雅的方式:

<xsl:if test="not(starts-with(@value, '1')) and not(starts-with(@value, '2')) and not(starts-with(@value, '3')) and not(starts-with(@value, '4')) and not(starts-with(@value, '5')) and not(starts-with(@value, '6')) and not(starts-with(@value, '7')) and not(starts-with(@value, '8')) and not(starts-with(@value, '9')) and not(starts-with(@value, '0')) ">

我正在使用XSLT 1.0。 提前谢谢。

4 个答案:

答案 0 :(得分:9)

使用

not(number(substring(@value,1,1)) = number(substring(@value,1,1)) )

或使用

not(contains('0123456789', substring(@value,1,1)))

最后,这可能是用于验证条件的最短XPath 1.0表达式

not(number(substring(@value, 1, 1)+1))

答案 1 :(得分:4)

它有点短,如果不是非常优雅或明显:

<xsl:if test="not(number(translate(substring(@value, 1, 1),'0','1')))">

基本思想是测试第一个字符是否为数字。需要进行translate()调用,因为0NaN都评估为false,我们需要将0视为true内{ {1}}致电。

答案 2 :(得分:4)

<xsl:if test="string(number(substring(@value,1,1)))='NaN'">
  1. 使用substring()来阻止@value
  2. 中的第一个字符
  3. 使用number()功能评估该字符
    1. 如果字符是数字,则会返回一个数字
    2. 如果该字符不是数字,则会返回NaN
  4. 使用string()函数将其作为字符串进行评估,并检查它是否为NaN

答案 3 :(得分:0)

<xsl:if test="string-length(number(substring(@value,1,1))) > 1">
  1. 使用substring()功能阻止@value
  2. 中的第一个字符
  3. 使用number()功能评估该字符
    1. 如果字符是数字,则会返回一个数字
    2. 如果该字符不是数字,则会返回NaN
  4. 使用string-length()来评估它是否大于1(不是数字)