在纯 XQuery 中将本地名称编码为 XmlConvert.EncodeLocalName

Encode local name like XmlConvert.EncodeLocalName in pure XQuery

你好,我想处理 Xml- 具有编码节点名称的文件,例如:

<CST_x002F_SOMETHING>
....
</CST_x002F_SOMETHING>

此节点名称应解码为 CST/SOMETHING

这些节点名称例如通过 EncodeName 编码。是否有任何内置的 XQuery 函数来解码这些名称?或者你有编码/解码功能吗?

XML Oracle-DB 生成的文件使用相同的转义机制。

您可以尝试以下方法。

XQuery

for $x in doc('input.xml')//CST_x002F_SOMETHING
return rename node $x as "whateveryouneed"

使用fn:analyze-string()拆分字符串并匹配_XXXX_部分。当您遇到这些部分之一时,请使用 bin:hex() 将十六进制转换为二进制,然后使用 bin:unpack-unsigned-integer() 将二进制转换为整数,然后使用 fn:codepoints-to-string() 将整数代码点转换为字符串。

二进制函数记录在 https://www.saxonica.com/documentation/index.html#!functions/expath-binary

需要 Saxon-PE 或更高版本。

您还可以使用新的 saxon:replace-with() 函数:

declare namespace bin = 'http://expath.org/ns/binary'; 
saxon:replace-with('CST_x002F_SOMETHING', '_x[0-9A-F]{4}_', 
   function($s) {$s => substring(3, 4) 
                    => bin:hex() 
                    => bin:unpack-unsigned-integer(0,2) 
                    => codepoints-to-string()} 

输出CST/SOMETHING