Есть ли "элегантный" способ проверить, что значение атрибута начинается с буквы?
Мне нужно проверить, начинается ли значение 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 (а не числа)