2010-11-22 7 views
0

ローカル関数で次の問題があります。XQuery:ローカル関数のネームスペースの問題

次の関数:

declare function local:exp($w as node()) as element()* { 
for $e in ($w/e) 
let $exp:= QName ("myns", "real") 
return 
    element {$exp}{ 
    attribute resource {$e/@lang} 
    } 
}; 

は、このXMLを生成します。

<real xmlns="myns" resource="eng"/> 

本当に必要なことは次のとおりです。

<myns:real rdf:resource="lang"/> 

は、どのように私はそれをachiveことができますか?

  1. 問題をどのように解決できますか?
  2. リソース属性にNSとして「rdf」を追加するにはどうすればよいですか。

ありがとうございます。

答えて

1

あなたはとてもとしてのQNameにプレフィックスを割り当てることができます。

let $exp:= QName ("urn:my-namespace", "myns:real") 

おそらくこの問題を解決する最良の方法は、あなたのクエリでこれらの名前空間を宣言し、ちょうど接頭辞でそれらを参照することです:

declare namespace rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"; 
declare namespace myns="urn:my-namespace"; 

declare function local:exp($w as node()) as element()* { 
for $e in $w/e 
return 
    element myns:real { 
    attribute rdf:resource {$e/@lang} 
    } 
}; 
あなたが直接コンストラクタを使用して、機能を簡素化することができます

注:答えを

declare function local:exp($w as node()) as element()* { 
for $e in $w/e 
return <myns:real rdf:resource="{$e/@lang}" /> 
}; 
+0

感謝。 あなたのソリューションは部分的に機能します。しかし、結果は次のようになります。 と入力します。 どうすれば削除できますか?私はコピーネームスペースの異なる変種を宣言したが、それは助けにはならない。 – user3111525

+0

クエリをキャッシュしていたoXygenだったはずです。結果の構造を変更した後、コピーネームスペース宣言が考慮され、NS宣言が結果から削除されます。再度、感謝します。 – user3111525

+1

@ user322034:ドキュメント内に名前空間を持たずに名前空間接頭辞を使用することはできません。あなたができることは、ドキュメント内のトップレベル要素にこれらのプレフィックスがあることを確認することです(宣言名前空間宣言と同じモジュールで作成された場合に実行されます)。その後、ドキュメントの先頭に表示されますすべてのmynsではなく、本当の要素です。 –

関連する問題