7.3.6 字符转义
   

一般而言,XPointer不会单独出现,其经常出现的位置是URI、XML文件中,这些上下文对一些特殊字符提出了转义要求,因此必须对XPointer中出现的相应字符进行转义。

  1. URI编码和转义

XPointer可以用于XLink的属性xlink:href定位资源片段,xlink:href属性值必须是URI,而一些字符不能直接出现在URI中,因此必须对这些字符进行转义。

URI中不允许出现的字符包括所有非ASCII字符和IETF RFC 2396排除的字符,但是其中的"#"、"%"和方括弧可以直接出现在URI中,这是由IETF RFC 2732定义。所有不允许的字符按照如下顺序进行转义。

  • 每一个不允许的字符转化为相应的UTF-8(IETF RFC 2279)编码;
  • 所有不允许的字符按照URI规则进行转义,即转化为%HH,HH是该字节的十六进制编码;
  • 原有的字符序列用新的字符序列替换。

例如:

xpointer(id( résumé ))
xpointer(//*[@id= résumé ])

转义为:

xpointer(id( r%C3%A9sum%C3%A9 ))%20
xpointer(//*%5B@id= r%C3%A9sum%C3%A9 %5D)

注意:虽然IETF RFC 2732允许方括弧直接出现,但是为了兼容那些未实现该标准的程序,方括弧最好转义出现。

  1. XML转义

由于XPointer是出现在XML文件中,必须按照XML的要求对相应的字符进行转义。包括"<"、"&"和XML规范规定的其他特殊字符,"<"和"&"转义后分别为"&lt;"和"&amp;",其他特殊字符的转义可以参考XML规范中的规定。例如:

xpointer(//book/chapter[position()<=5])

转义为:

xpointer(//book/chapter[position() &lt;= 5])
  1. XPointer转义

XPointer本身对一些字符提出了转义要求。为了保证正确识别和计算,XPointer的各个部分(XPointer的一个部分是指一个完整的XPointer(…),多个XPointer(…)连接起来形成一个完整形式的XPointer)要求括弧匹配,因此必须对不匹配的括弧进行转义,即使在字符串常量中的括弧也必须进行转义。转义的方法是在前面加上一个"^",如果表达式中出现"^",则在前再加一个"^",即用"^("代替"(",用"^)"代替")",用"^^"代替"^"。

注意:转义只是针对不匹配的括弧,而不是对所有括弧。