Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 XPATH, получить значение одного из родителей  [new]
Bobby
Member

Откуда:
Сообщений: 638
Всем доброго дня и всех с наступающим!
Есть вот такой XML:
            <address-set>
              <name junos:key="key">SKYPE</name>
              <address>
                <name junos:key="key">skype-net1</name>
              </address>
              <address>
                <name junos:key="key">skype-net2</name>
              </address>
            .....
            </address-set>
            <address-set>
              <name junos:key="key">SOMETHING</name>
              <address>
                <name junos:key="key">Something</name>
              </address>
            .....
            </address-set>

Задача вытащить значения узлов <name> , которые идут сразу под <address-set> (имя адресного сета), в который входит адрес (узел <address>) с заданным именем в переменной.
Делаю следующим образом:
  	SELECT 
	Tab.Col.value('name[1]/.','varchar(150)')  AS set_name,
	Tab.Col.value('.','varchar(150)')  AS name
	FROM   @xm.nodes('//configuration/security/zones/security-zone[name=sql:variable("@zone_name")]/address-book/address-set/address[name=sql:variable("@code_name")]/name') Tab(Col)  

@code_name для примера равен skype-net1, на выходе в идеале должно быть
SET_NAME NAME
SKYPE skype-net1
но в итоге получаю:
NULL skype-net1
Подскажите, плз, в чем грабли! Заранее благодарен!!
29 дек 16, 16:08    [20061184]     Ответить | Цитировать Сообщить модератору
 Re: XPATH, получить значение одного из родителей  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 942
DECLARE @xml XML = '<root>
            <address-set>
              <name key="key">SKYPE</name>
              <address>
                <name key="key">skype-net1</name>
              </address>
              <address>
                <name key="key">skype-net2</name>
              </address>
            </address-set>
            <address-set>
              <name key="key">SOMETHING</name>
              <address>
                <name key="key">Something</name>
              </address>
            </address-set>
            </root>'
SELECT
  [set] = a1.n.value( 'name[1]', 'VARCHAR(50)' ),
  [name] = a2.n.value( 'name[1]', 'VARCHAR(50)' )
FROM
  @xml.nodes( '//address-set' ) a1( n )
  CROSS APPLY a1.n.nodes( 'address' ) a2( n )
29 дек 16, 16:17    [20061212]     Ответить | Цитировать Сообщить модератору
 Re: XPATH, получить значение одного из родителей  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
так?
SELECT 
  Tab1.Col.value('name[1]','varchar(150)')  AS set_name,
  Tab2.Col.value('.','varchar(150)')  AS name
from @xm.nodes('//configuration/security/zones/security-zone[name=sql:variable("@zone_name")]/address-book/address-set') Tab1(Col)
  cross apply Tab1.Col.nodes('address[name=sql:variable("@code_name")]/name') Tab2(Col)
29 дек 16, 16:18    [20061216]     Ответить | Цитировать Сообщить модератору
 Re: XPATH, получить значение одного из родителей  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 942
... и с заданным именем:
SELECT
  [set] = a1.n.value( 'name[1]', 'VARCHAR(50)' ),
  [name] = a2.n.value( 'name[1]', 'VARCHAR(50)' )
FROM
  @xml.nodes( '//address-set[name="SKYPE"][1]' ) a1( n )
  CROSS APPLY a1.n.nodes( 'address' ) a2( n )
29 дек 16, 16:19    [20061219]     Ответить | Цитировать Сообщить модератору
 Re: XPATH, получить значение одного из родителей  [new]
Bobby
Member

Откуда:
Сообщений: 638
daw,
огромное спасибо, все получилось!
29 дек 16, 16:26    [20061241]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить