在XQuery中,如何将xml与computed element constructor混合以从变量设置节点标记。
我试过这样做,但没有运气:
if ($x eq "something") then
<cp:value>
{element {fn:string-join( ("if:GICS", $cp/@id), "" )} {""}}
</cp:value>
预期输出为:
<cp:value>
<if:GICS1234 />
</cp:value>
答案 0 :(得分:1)
元素构造函数的元素名称部分需要xs:QName
来生成元素名称。如果提供了一个字符串,它会将它强制转换为QName,就像你调用了`xs:QName('my-element-name')一样。
因此,您必须遵守您遵守的所有规则,就好像您在那里有一个明确的xs:QName()
构造函数一样。这意味着如果您使用名称空间前缀(例如if:
),则必须可以在静态上下文中解析此名称空间。
您可以做的最简单的事情就是在您的序言中声明您的if:
命名空间(可能是您声明了cp:
命名空间):
declare namespace if = "http://example.org/if";
element {fn:concat('if:GICS','1234') } {}
(: usually produces <if:GICS1234 xmlns:if="http://example.org/if"/> :)
如果您不想这样做,可以使用fn:QName()
函数和if:
的完整命名空间显式构造QName。 (注意*fn:*QName
与*xs:*QName
不同!)
element {fn:QName('http://example.org/if', fn:concat('GICS', '1234'))} {}
(: usually produces <GICS1234 xmlns="http://www.example.org/if"/> :)
如果要控制使用的前缀,可以在第二个参数中包含“if:”:
element {fn:QName('http://example.org/if', fn:concat('if:GICS','1234'))} {}
(: produces <if:GICS1234 xmlns:if="http://example.org/if"/> :)
请注意,您在xml输出中获得的 前缀可能因xquery处理器和您生成的xml的结构而异,但您将始终获得等效的XML Infoset。
答案 1 :(得分:0)
您不能在字符串中直接使用名称空间前缀。您需要从命名空间URL创建包含命名空间的QName。
使用类似
的内容if ($x eq "something") then
<cp:value>
{element {fn:QName("if namespace url", fn:string-join( ("if:GICS", $cp/@id), "" ))} {""}}
</cp:value>
你也可以使用concat而不是string-join
if ($x eq "something") then
<cp:value>
{element {fn:QName("if namespace url", fn:concat( ("if:GICS", $cp/@id) ))} {""}}
</cp:value>