1

在 XQuery 中,如何将 xml 与计算元素构造函数混合以从变量中设置节点的标记。

我试过这样做,但没有运气:

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

预期的输出是:

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

2 回答 2

2

元素构造函数的元素名称部分需要一个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()函数和完整的命名空间显式构造一个 QName if:。(注意*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。

于 2012-12-21T13:21:39.073 回答
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>
于 2012-12-21T13:01:38.980 回答