我有xml
<translation id="A">mi casa</translation>
<translation id="B">
<div style="width:100px; white-space:normal; line-height:13px;" onclick="DoSomething()">una gato</div>
</translation>
<translation id="C">ese</translation>
希望生成以下结果集
attr parent value
style B width:100px; white-space:normal; line-height:13px;
onclck B DoSomething()
此XML文档中的大多数内容都侧重于翻译ID的价值。可以存在许多且没有其他属性。
我已经走到了这一步:
select
pnd.value('(..//@id)[1]','nvarchar(200)') ID
, pnd.value('(//div/@*) [1] ','nvarchar(max)') elem
,pnd.value('local-name(@*[1])','nvarchar(200)') as Attribute
from @inputXML.nodes('/translation_collection/translation/*') pn(pnd)
编辑:在寻找所有人时,只给我第一个单身人士。无法通过MSDN上的膨胀来了解如何在不使用[1] / [2]的情况下查询我需要的内容
答案 0 :(得分:0)
你很接近,只需在nodes函数中使用@*
来获取所有属性
declare @data xml = '
<translation id="A">mi casa</translation>
<translation id="B">
<div style="width:100px; white-space:normal; line-height:13px;" onclick="DoSomething()">una gato</div>
</translation>
<translation id="C">ese</translation>'
select
t.c.value('local-name(.)', 'nvarchar(max)') as attr,
t.c.value('../../@id', 'nvarchar(max)') as parent,
t.c.value('.', 'nvarchar(max)') as value
from @data.nodes('translation/div/@*') as t(c)
<强> sql fiddle demo 强>