将XML属性和其他属性与父属性值SQL Server 2008配对

时间:2013-10-21 20:39:41

标签: sql sql-server xml xpath sqlxml

我有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]的情况下查询我需要的内容

1 个答案:

答案 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