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

#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'">
  
  1. Используйте substring() , чтобы выделить первый символ из @value значения
  2. Используйте number() функцию для оценки этого символа
    1. Если символ является числом, он вернет число
    2. Если символ не является числом, он вернет NaN
  3. Используйте string() функцию, чтобы оценить это как строку и проверить, так ли это NaN или нет.

Ответ №4:

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