четверг, 10 марта 2011 г.

Url encoding средствами XSLT 1.0

Я уже писал в предыдущем посте, что пытался организовать Url encoding исключительно средствами чистого XSLT 1.0. Мне это удалось. Выглядит довольно криво, но вполне работоспособно. Подробнее под катом. О схеме кодирования нелатинских символов и спецсимволов в урле можно почитать в разделе "Кодирование URL" статьи об Url в Википедии.


Итак, файл UriEncoding.xsl:


  
 
      
 

 

 

 
  
  
   
    
   
   
    
   
   
    
   
   
    
   
  
 

 
  
  
  
   
    
   
   
    
     
      
     
    
    
     
     
    
   
  
 

 
  
  
   
   
  
 



Здесь шаблон uri-encode-step "откусывает" от преобразовываемой строки (параметр original) первый символ, преобразует его и добавляет в конец результата (параметр result). Кроме того, этот шаблон рекурсивно вызывает самого себя. Рекурсивного вызова не происходит, когда $original пуст, то есть все символы преобразованы - в этом случае просто возвращается $result.

Шаблон uri-encode (ради которого, собственно, всё и затевалось) принимает параметром строку, которую нужно преобразовать и производит первый вызов шаблона uri-encode-step.

Шаблон uri-encode-step преобразует каждый символ с помощью шаблона symbolEncode.

Шаблон symbolEncode, получив символ в качестве параметра, проверяет, есть ли он среди символов, для которых в uri необходимы особые коды (это знак процента, кириллица и специальные символы, они собраны в соответствующих строках-переменных cyrillicSymbols и specialSymbols). Если есть, то код символа ищется в соответствующих строках cyrillicSymbolsUriCodes и specialSymbolsUriCodes. Если нет, то в качестве результата преобразования берётся исходный символ.



Использовать можно так:

...

 
  
 

...
Дальше, где нужно, используем переменную $inProcessUriEncoded.
Достаточно громоздко, но на мой взгляд всё же лучше, чем самому вбивать вместо понятной строки 'В процессе' вот такую: %D0%92%20%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%B5.

Комментариев нет:

Отправить комментарий