使用XSLT转义URI路径

时间:2011-11-05 02:17:05

标签: xml xslt encoding uri

我正在开发一个数据聚合项目,我需要将来自各种数据提供者的XML数据转换为通用格式,这需要对数据集中的所有URI值进行适当的转义。这是我从数据提供者处收到的示例URI。它在路径组件中包含保留字符(“[”,“]”):

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

这是我需要的转义表单:

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

我计划使用XSLT和EXSLT编码-ri函数(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函数不会转义保留字符。

所以我想,我需要的是在URI的各个路径组件上应用URI编码。是否有任何现有的功能,或者我需要在XSL(T)中启动URI解析?

THX

1 个答案:

答案 0 :(得分:2)

我认为您需要启动URI解析。

原因是您的数据提供程序将保留字符捣碎为特殊内容(例如/作为路径组件分隔符)以及不具有其特殊含义的保留字符,并且需要进行转义(例如{ {1}})。 [函数怎么能知道逃避哪个以及哪个单独留下?

所以是的,你需要开始解析URI。如果您确信没有encode-uri()字符需要转义,我会

  • 复制初始/未触及的
  • 使用EXSLT的http(s)://通过tokenize()
  • 将其余部分分解为路径组件
  • encode-uri()每个组件
  • 并与/
  • 一起加入