2012-09-14 55 views
2

用下面如何在查詢期間預先在元素中的xml命名空間?

DECLARE @t TABLE (Test nvarchar(50), Location_ID uniqueidentifier); 
INSERT INTO @t (Test,Location_ID) 
SELECT Test,Location_ID 
from 
dbo.TEST; 
DECLARE @xml XML 
;WITH XMLNAMESPACES (
'typens:GPCodedValueDomain2' as type, 
'http://www.esri.com/schemas/ArcGIS/10.0' as typens, 
'http://www.w3.org/TR/html4/' AS xs, 
'http://www.w3.org/2001/XMLSchema-instance' AS xsi) 
SELECT @xml = 
    (
    SELECT 
    'typens:CodedValue' AS "@xsi:type", 
    TEST AS "Name", Location_ID AS "Code" 
    FROM @t 
    order by Location_ID 
    FOR XML PATH 
    ('CodedValue'), ROOT 
    ('GPCodedValueDomain2'),TYPE 
    ) 
SELECT @xml 

它輸出

<GPCodedValueDomain2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/TR/html4/" xmlns:typens="http://www.esri.com/schemas/ArcGIS/10.0" xmlns:type="typens:GPCodedValueDomain2"> 
    <CodedValue xsi:type="typens:CodedValue"> 
    <Name>test update</Name> 
    <Code>B59D3BEB-CBCE-E111-B5B0-002564D275D1</Code> 
    </CodedValue> 
    <CodedValue xsi:type="typens:CodedValue"> 
    <Name>test update</Name> 
    <Code>B69D3BEB-CBCE-E111-B5B0-002564D275D1</Code> 
    </CodedValue> 
    <CodedValue xsi:type="typens:CodedValue"> 
    <Name>test update</Name> 
    <Code>B79D3BEB-CBCE-E111-B5B0-002564D275D1</Code> 
    </CodedValue> 
</GPCodedValueDomain2> 

我一直在嘗試了幾個小時的命名空間定義的不同迭代,全部失敗。我正在尋找的輸出是:

<GPCodedValueDomain2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/TR/html4/" xmlns:typens="http://www.esri.com/schemas/ArcGIS/10.0" xmlns:type="typens:GPCodedValueDomain2"> 
    <CodedValue xsi:type="typens:CodedValue"> 
    <Name>test update</Name> 
    <Code xsi:type="xs:string">B59D3BEB-CBCE-E111-B5B0-002564D275D1</Code> 
    </CodedValue> 
    <CodedValue xsi:type="typens:CodedValue"> 
    <Name>test update</Name> 
    <Code xsi:type="xs:string">B69D3BEB-CBCE-E111-B5B0-002564D275D1</Code> 
    </CodedValue> 
    <CodedValue xsi:type="typens:CodedValue"> 
    <Name>test update</Name> 
    <Code xsi:type="xs:string">B79D3BEB-CBCE-E111-B5B0-002564D275D1</Code> 
    </CodedValue> 
</GPCodedValueDomain2> 

任何想法如何實現這?謝謝

回答

1

我不是SQL Server的用戶,但我不知道你是否真的提供了一個模式文檔,它在命名空間中定義了一個名爲string的類型。

將前綴xs綁定到其名稱是HTML 4規範的URI的名稱空間絕對沒有錯。但有幾件事讓我懷疑你是否已經清楚地明確了你的問題。

  • HTML 4規範沒有定義名爲string的數據類型;除非你在這裏沒有顯示的模式文檔中做非常不尋常的事情,xs:string不會表示已知類型。
  • 您似乎將名稱空間前綴type綁定到名稱空間URI typens:GPCodedValueDomain2。該名稱空間前綴似乎並未在其他地方使用,因此目前尚不清楚它的用途。在該名稱空間名稱中使用的URI方案typens也是在查詢中其他位置定義的名稱空間前綴,這一事實表明您對名稱空間和名稱空間前綴感到困惑,或者您正在做的事情非常微妙和迂迴。在後一種情況下,你肯定不需要堆棧溢出的幫助。
  • 您想在輸出中的CodedValueCode元素上使用xsi:type屬性。您的查詢通過爲其指定SELECT 'typens:CodedValue' AS "@xsi:type", ...將該屬性置於第一位成功。但是對於Code元素沒有類似的構造。爲什麼不?
+0

xml來自最初由應用程序填充的列,該應用程序通過xml執行很大一部分應用程序配置,其中posted xml是一個示例。我感謝你的評論,但我沒有做任何「迂迴」的事情,也沒有發明自己的名字空間。我只是在處理應用程序輸出的內容,以及爲了讀取xml並將元素/節點呈現給應用程序而需要的內容。 – tpcolson