Есть ли "элегантный" способ проверить, что значение атрибута начинается с буквы?

Мне нужно проверить, начинается ли значение 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. Спасибо заранее.

Ответ 1

Использование

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))

Ответ 2

Это немного короче, если не совсем элегантно или очевидно:

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

Основная идея - проверить, является ли первый символ цифрой. Вызов translate() необходим, потому что 0 и NaN оцениваются как false, и нам нужно 0 рассматривать как true внутри вызова not().

Ответ 3

<xsl:if test="string(number(substring(@value,1,1)))='NaN'">
  • Используйте substring(), чтобы уловить первый символ из значения @value
  • Используйте функцию number() для оценки этого символа
    • Если символ является числом, он вернет номер
    • Если символ не является числом, он вернет NaN
  • Используйте функцию string(), чтобы оценить это как строку и проверить, есть ли она NaN или нет.

Ответ 4

<xsl:if test="string-length(number(substring(@value,1,1))) > 1">
  • Используйте функцию substring(), чтобы уловить первый символ из значения @value
  • Используйте функцию number() для оценки этого символа
    • Если символ является числом, он вернет номер
    • Если символ не является числом, он вернет NaN
  • Используйте string-length() для оценки того, было ли оно больше 1 (а не числа)