在BaseX中用XQuery替换节点时,如何保留XML重要空白字符?
解决BaseX中替换节点时保留
xml:space="preserve"内空白的问题 问题核心在于:BaseX直接构造XML节点时,会默认规范化元素内的空白,即便你添加了xml:space="preserve"属性,该属性的规则也不会自动生效——它是XML解析阶段的生效规则,而XQuery直接构造节点时的空白会被当作可忽略空白处理。
以下是两种可靠的解决方法:
方法1:显式构造空白文本节点
用{ ' ' }显式生成空白文本节点替代直接写空格,BaseX会将这个空格视为独立的文本节点保留,不会折叠:
let $db := 'Test' let $new := <bibl xml:space="preserve"> <name>Hugo</name>{ ' ' }<region>Vordertupfingen</region> </bibl> return replace node collection($db)//entry[@xml:id='hugo01']/cit/bibl with $new
方法2:通过字符串解析生成节点
使用parse-xml()函数解析XML字符串,让BaseX按照XML解析规则处理xml:space="preserve",从而保留指定空白:
let $db := 'Test' let $newXmlStr := '<bibl xml:space="preserve"><name>Hugo</name> <region>Vordertupfingen</region></bibl>' let $new := parse-xml($newXmlStr) return replace node collection($db)//entry[@xml:id='hugo01']/cit/bibl with $new
两种方法都能确保<name>与<region>之间的空白被保留,方法1更适合简单结构,方法2适配复杂XML场景。
内容的提问来源于stack exchange,提问作者leu
相关产品推荐
相关产品推荐

