2017-03-28 13 views
1

接頭辞付きの属性に関連して、ある種の奇妙な振る舞いを見つけました。たいていの場合、接頭辞付きの属性は名前空間にある要素に属しているため、使用されていません。私は名前空間のエイリアスを与えることができますXMLのデフォルト名前空間と接頭辞付き属性

SELECT @xml.value(N'(/*:root/*:SomeElement/@*:SomeAttribute)[1]',N'nvarchar(max)'); 

:私は名前空間をワイルドカードでき

DECLARE @xml XML= 
N'<test:root xmlns:test="SomeURL"> 
    <test:SomeElement test:SomeAttribute="yeah!" /> 
    </test:root>'; 

:しかし、まもなく私もいくつかの研究の後、質問に答えることを試みたと私は理解できなかった何かを見つけました:

WITH XMLNAMESPACES('SomeURL' AS ns) 
SELECT @xml.value(N'(/ns:root/ns:SomeElement/@ns:SomeAttribute)[1]',N'nvarchar(max)'); 

は、私は思った - 唯一のネームスペースがあるので、 - 私はそれをデフォルトとして使用できます。

WITH XMLNAMESPACES(DEFAULT 'SomeURL') 
SELECT @xml.value(N'(/root/SomeElement/@SomeAttribute)[1]',N'nvarchar(max)'); --fails! 

私は、上記と同じように使用しますが、それが動作属性にワイルドカードを設定した場合:

WITH XMLNAMESPACES(DEFAULT 'SomeURL') 
SELECT @xml.value(N'(/root/SomeElement/@*:SomeAttribute)[1]',N'nvarchar(max)'); 

私は属性が同じようにすべての、test/SomeURL名前空間のメンバーであることを、私は見昔ながらFROM OPENXMLを使用する場合要素:

DECLARE @hdoc INT; 
EXEC sp_xml_preparedocument @hdoc OUTPUT, @xml; 

SELECT * FROM OPENXML (@hdoc, '//*',3); 

EXEC sp_xml_removedocument @hdoc; 

結果:

+----+----------+----------+---------------+--------+--------------+----------+------+---------+ 
| id | parentid | nodetype | localname  | prefix | namespaceuri | datatype | prev | text | 
+----+----------+----------+---------------+--------+--------------+----------+------+---------+ 
| 0 | NULL  | 1  | root   | test | SomeURL  | NULL  | NULL | NULL | 
+----+----------+----------+---------------+--------+--------------+----------+------+---------+ 
| 2 | 0  | 2  | test   | xmlns | NULL   | NULL  | NULL | NULL | 
+----+----------+----------+---------------+--------+--------------+----------+------+---------+ 
| 5 | 2  | 3  | #text   | NULL | NULL   | NULL  | NULL | SomeURL | 
+----+----------+----------+---------------+--------+--------------+----------+------+---------+ 
| 3 | 0  | 1  | SomeElement | test | SomeURL  | NULL  | NULL | NULL | 
+----+----------+----------+---------------+--------+--------------+----------+------+---------+ 
| 4 | 3  | 2  | SomeAttribute | test | SomeURL  | NULL  | NULL | NULL | 
+----+----------+----------+---------------+--------+--------------+----------+------+---------+ 
| 6 | 4  | 3  | #text   | NULL | NULL   | NULL  | NULL | yeah! | 
+----+----------+----------+---------------+--------+--------------+----------+------+---------+ 

の周辺で見つかるはずですが、私は興味がありますが、これはちょっとした問題ですが、私は興味があります...

答えて

2

XMLと同様に、デフォルトの名前空間は属性には適用されません。接頭辞なしで記述された要素名はデフォルトの名前空間を仮定し、接頭辞なしで記述された属性名は "名前空間なし"とみなします。

+0

この回答は - ああ - ちょうど明白な動作を説明し、はい、あなたは完全に正しいです。これは完全に直感的ではないかもしれませんが、そのままです*。それ以上の説明はできません。したがって、私はこの答えに印をつけます。 – Shnugo

関連する問題