解析XML:检索节点的值,其中@name=相对路径



这里是我的XML的摘录:

declare @FundXML XML
set @XML='<Transaction>
            <TransactionID>58265226</TransactionID>
            <SettlementCurrency>USD</SettlementCurrency>
            <SettlementAmount>
              <Amount ccy="EUR" isFundCcy="true">-1603375.03</Amount>
              <Amount ccy="USD">-1890218.82</Amount>
            </SettlementAmount>
          </Transaction>'

我想检索标签金额的值,其中ccy="标签结算货币">

如果我硬编码"美元",那么它给了我正确的价值:

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)

但是我想编写类似的东西

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)

你能帮我写一个相对路径吗?我正在使用 SQL Server 2008。

谢谢

像这样试试

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)

相关内容

最新更新