OSB XQuery中带命名空间的faultcode元素生成及文本前缀疑问
在Oracle Service Bus 12c XQuery 1.0中生成带作用域命名空间的特定faultcode元素
需要生成的目标元素为:
<faultcode xmlns:http="http://blah.blah.com/dynamicValue">http:fault400</faultcode>
尝试了两种写法均不符合预期:
第一种写法
element{ QName( concat("http://blah.blah.com/",$dynamicValue), "faultcode") }{"http:fault400"}
返回结果:
<http:faultcode xmlns:http="http://blah.blah.com/dynamicValue">http:fault400</http:faultcode>
第二种写法
element{ "faultcode" }{QName( concat("http://blah.blah.com/",$dynamicValue),"http:fault400")}
返回结果:
<faultcode>http:fault400</faultcode>
限定文本的设计原因
http:fault400只是普通字符串文本,并非命名空间限定的QName。这种设计多出现于SOAP错误场景:SOAP规范要求faultcode用「前缀:本地名」格式标识错误类型,但前缀对应的命名空间仅需在元素上声明即可,文本内容本身不需要被解析为带命名空间的节点,仅作为语义标识传递。- 作用域内的命名空间声明(
xmlns:http="...")是为了让前缀http在当前元素范围内具备合法性,但元素本身不需要归属该命名空间——目标元素的本地名就是faultcode,不带命名空间前缀。
正确的生成方法
要实现目标,需创建无命名空间的faultcode元素,同时为其添加指定的命名空间声明,文本内容直接使用字符串"http:fault400"。XQuery 1.0中可通过显式声明命名空间属性的方式实现:
element faultcode { attribute xmlns:http { concat("http://blah.blah.com/", $dynamicValue) }, "http:fault400" }
说明:
element faultcode直接创建本地名为faultcode的无命名空间元素attribute xmlns:http { ... }显式添加命名空间声明属性,XQuery处理器会自动识别这是合法的命名空间声明,而非普通属性- 最后传入字符串
"http:fault400"作为元素的文本内容
执行后生成的结果即为预期的:
<faultcode xmlns:http="http://blah.blah.com/dynamicValue">http:fault400</faultcode>
内容的提问来源于stack exchange,提问作者Dmytro
相关产品推荐
相关产品推荐

