2011-11-05 62 views
2

我正在处理一个数据聚合项目,我需要将来自各种数据提供程序的XML数据转换为通用格式,这需要数据集中的所有URI值都正确转义。这里是我从数据提供者接收的一个示例URI。它包含保留字符( “[”, “]”)在其路径组成:使用XSLT转义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保留字符,如果他们在正确的地方。

如果我使用的编码,URI功能如下

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

,因为被称为一个布尔值false标志时编码-URI功能无法逃脱保留字符的括号没有逃脱。

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

Thx

回答

2

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

原因是您的数据提供者将保留的字符(例如/作为路径组件分隔符)与保留字符混合在一起,这些保留字符意味着一些特殊的含义(例如[)。 encode-uri()函数怎么知道要逃避哪些以及哪个要离开?

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

  • 副本初始http(s)://不变
  • 使用EXSLT的tokenize()通过/
  • 打破休息成路径组件编码-URI ()每个组件
  • 并将它们连接在一起/