#xslt #xpath
#xslt #xpath
Вопрос:
Мне нужно проверить, начинается ли значение attibute с буквы. Если это не так, я добавлю к нему префикс «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. Операции обработки строк в XSLT 1.0 часто возможны, но они редко бывают элегантными.
2. @Michael — верно, но этот ответ определенно более элегантный, чем тот, что у меня был!
Ответ №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))
Комментарии:
1. Отличные ответы — 1. Третий и самый короткий способ — это приятный поворот. Никогда бы не подумал об этом.
2. @Jacqueline: Да, XPath — удивительный язык, и он становится еще более популярным в версиях 2.0 и 3.0.
Ответ №2:
Это немного короче, если не совсем элегантно или очевидно:
<xsl:if test="not(number(translate(substring(@value, 1, 1),'0','1')))">
Основная идея состоит в том, чтобы проверить, является ли первый символ цифрой. translate()
Вызов необходим, потому что 0
и NaN
оба вычисляют false
, и нас нужно 0
рассматривать как true
внутреннюю часть not()
вызова.
Комментарии:
1. 1 за отличный ответ. И спасибо за информацию о том, что ‘0’ возвращает false.
Ответ №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 (не числа)