解析XML:检索@ name = RelativePath的节点的值

时间:2018-03-19 09:45:31

标签: xml tsql xpath xml-parsing xquery

这是我的XML摘录:

select trx.col.value('./SettlementCurrency[1]', 'nvarchar(20)') Settccy,
trx.col.value('(./SettlementAmount[1]/Amount[@ccy="USD"])[1]', 'nvarchar(20)') AmountInccy 
from @xml.nodes('/Transaction') Trx(col)

我想检索标签Amount的值,其中ccy =" Tag SettlementCurrency"

如果我硬co" USD"然后它给了我正确的价值:

select trx.col.value('./SettlementCurrency[1]', 'nvarchar(20)') Settccy, 
trx.col.value('(./SettlementAmount[1]/Amount[@ccy=./SettlementCurrency[1]])[1]', 'nvarchar(20)') AmountInccy
from @Fundxml.nodes('/Transaction') Trx(col)

但是我想编写类似

的代码
textfield.frame.size.width
你可以帮我写一个相对路径吗? 我使用的是SQL Server 2008。

由于

1 个答案:

答案 0 :(得分:0)

尝试这样

select trx.col.value('(SettlementCurrency/text())[1]', 'nvarchar(20)') Settccy, 
trx.col.value('(SettlementAmount/Amount[@ccy=../../SettlementCurrency/text()])[1]', 'nvarchar(20)') AmountInccy
from @Fundxml.nodes('/Transaction') Trx(col)

在谓词中,您在XML中更深入,在跳到<Amount>之前,您必须跳出<SettlementAmount>并跳出<SettlementCurrency>

如果您的XML中只有一个<SettlementCurrency>,则可以使用深度搜索(使用//)代替:

select trx.col.value('(SettlementCurrency/text())[1]', 'nvarchar(20)') Settccy, 
trx.col.value('(SettlementAmount/Amount[@ccy=//SettlementCurrency/text()])[1]', 'nvarchar(20)') AmountInccy
from @Fundxml.nodes('/Transaction') Trx(col)

第三个选项是使用XQuery s let</Transaction>节点的上下文中创建一个具有此值的变量:

select trx.col.value('(SettlementCurrency/text())[1]', 'nvarchar(20)') Settccy, 
trx.col.value('let $c:=(SettlementCurrency/text())[1] 
               return (SettlementAmount/Amount[@ccy=$c])[1]', 'nvarchar(20)') AmountInccy
from @Fundxml.nodes('/Transaction') Trx(col)