Экранирование путей URI с помощью XSLT - PullRequest
2 голосов
/ 05 ноября 2011

Я работаю над проектом агрегации данных, в котором мне нужно преобразовать данные XML от различных поставщиков данных в общий формат, который требует, чтобы все значения URI в наборе данных были должным образом экранированы. Вот пример URI, который я получаю от поставщика данных. Он содержит зарезервированные символы ("[", "]") в своем компоненте пути:

http://ogimages.bl.uk/images/001/001ROY000018D03U00107000[SVC1].jpg

Мне нужна эта экранированная форма:

http://ogimages.bl.uk/images/001/001ROY000018D03U00107000%5BSVC1%5D.jpg

Я планировал использовать XSLT с функцией EXSLT encode-uri (http://www.exslt.org/str/functions/encode-uri/str.encode-uri.html) для экранирования URI во время преобразования. В настоящее время я использую его следующим образом:

xsl:value-of select="str:encode-uri(., true())"/>

, который экранирует полный URI и приводит к

http%3A%2F%2Fogimages.bl.uk%2Fimages%2F001%2F001ROY000018D03U00107000%5BSVC1%5D.jpg

Это не то, что мне нужно, потому что я хотел бы сохранить зарезервированные символы URI, если они находятся в нужном месте.

Если я использую функцию encode-uri следующим образом

xsl:value-of select="str:encode-uri(., false())"/>

скобки не экранированы, потому что функция encode-uri не экранирует зарезервированные символы при вызове с логическим флагом false.

Итак, я думаю, что мне нужно применить кодировку URI к отдельным компонентам пути URI. Существуют ли какие-либо функции для этого или мне нужно запустить разбор URI в XSL (T)?

Thx

1 Ответ

2 голосов
/ 05 ноября 2011

Я думаю, вам нужно начать анализ URI.

Причина в том, что ваш провайдер данных использовал зарезервированные символы, которые означают что-то особенное (например, / в качестве разделителя компонентов пути) вместе с зарезервированными символами, которые этого не делают.имеют особое значение и должны быть экранированы (например, [).Как функция encode-uri() может узнать, что нужно убрать, а что оставить в покое?

Так что да, вам нужно начать анализ URI.Если вы уверены, что нет / символов, которые нужно экранировать, я бы

  • скопировал бы исходную http(s):// нетронутую
  • , используя EXSLT tokenize(), чтобы разбить остальныев компоненты пути с помощью /
  • encode-uri () каждого компонента
  • и объедините их вместе с /
...