在纯 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
你好,我想处理 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