Xml XQuery-在文本中使用计算元素构造函数

Xml XQuery-在文本中使用计算元素构造函数,xml,xquery,Xml,Xquery,在XQuery中,如何将xml和从变量设置节点标记混合使用 我试着这样做,但没有成功: if ($x eq "something") then <cp:value> {element {fn:string-join( ("if:GICS", $cp/@id), "" )} {""}} </cp:value> 如果($x eq“某物”),那么 {element{fn:string join((('if:GICS',$cp/@id),“)}{}

在XQuery中,如何将xml和从变量设置节点标记混合使用

我试着这样做,但没有成功:

 if ($x eq "something") then
    <cp:value>
      {element {fn:string-join( ("if:GICS", $cp/@id), "" )} {""}}
    </cp:value>
如果($x eq“某物”),那么
{element{fn:string join((('if:GICS',$cp/@id),“)}{}
预期产出为:

<cp:value>
  <if:GICS1234 />
</cp:value>

字符串中不能直接包含名称空间前缀。您需要从名称空间url创建一个包含名称空间的QName

使用类似

if ($x eq "something") then
  <cp:value>
    {element {fn:QName("if namespace url", fn:string-join( ("if:GICS", $cp/@id), "" ))} {""}}
  </cp:value>
如果($x eq“某物”),那么
{element{fn:QName(“如果名称空间url”,fn:string连接(((“如果:GICS”,“$cp/@id),”))}{}
您也可以使用concat而不是string join

if ($x eq "something") then
  <cp:value>
    {element {fn:QName("if namespace url", fn:concat( ("if:GICS", $cp/@id) ))} {""}}
  </cp:value>
如果($x eq“某物”),那么
{element{fn:QName(“如果名称空间url”,fn:concat(((“如果:GICS”,$cp/@id)))}{'}

元素构造函数的元素名部分需要一个
xs:QName
来生成元素名。如果为它提供了一个字符串,它会将其强制为QName,就像您调用了`xs:QName('my-element-name')

因此,您必须遵守所有您将遵守的规则,就像您在其中有一个显式的
xs:QName()
构造函数一样。这意味着如果您使用的是名称空间前缀(例如
if:
),则必须能够在静态上下文中解析此名称空间

您可以做的最简单的事情就是在prolog中简单地声明
if:
名称空间(就像您声明
cp:
名称空间一样):

如果要控制使用的前缀,可以在第二个参数中包含“If:”:

element {fn:QName('http://example.org/if', fn:concat('if:GICS','1234'))} {}

(: produces <if:GICS1234 xmlns:if="http://example.org/if"/> :)
元素{fn:QName('http://example.org/if“,fn:concat('if:GICS','1234'))}{
(:生产:)
请注意,您在xml输出中得到的前缀可能因xquery处理器和您正在生成的xml的结构而异,但您始终会得到等效的xml信息集

element {fn:QName('http://example.org/if', fn:concat('GICS', '1234'))} {}

(: usually produces <GICS1234 xmlns="http://www.example.org/if"/> :)
element {fn:QName('http://example.org/if', fn:concat('if:GICS','1234'))} {}

(: produces <if:GICS1234 xmlns:if="http://example.org/if"/> :)