2012-12-21 67 views
0

在XQuery中使用计算元素构造,我该如何与computed element constructor混合使用XML来从一个变量设置一个节点的标签。的XQuery - 文本

我试图做这种方式,但没有运气:

if ($x eq "something") then 
    <cp:value> 
     {element {fn:string-join(("if:GICS", $cp/@id), "")} {""}} 
    </cp:value> 

的预期结果是:

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

回答

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"/> :) 

如果你想控制使用的前缀,“如果:”您可以在第二个参数:

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。

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代替字符串连接

if ($x eq "something") then 
    <cp:value> 
    {element {fn:QName("if namespace url", fn:concat(("if:GICS", $cp/@id)))} {""}} 
    </cp:value>