【问题标题】:Parse XML : retrieve value of a node where @name=RelativePath解析 XML:检索 @name=RelativePath 的节点的值
【发布时间】:2018-08-27 19:57:06
【问题描述】:

这里是我的 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="Tag SettlementCurrency" 的标签 Amount 的值

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

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。

谢谢

【问题讨论】:

    标签: xml tsql xpath xml-parsing xquery


    【解决方案1】:

    这样试试

    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,您必须跳出 @9​​87654322@ 并跳出 @9​​87654323@,然后才能深入到 &lt;SettlementCurrency&gt;

    如果您的 XML 中只有一个 &lt;SettlementCurrency&gt;,您可以改用 深度搜索(使用 //):

    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)
    

    第三个选项是使用XQuerys let&lt;/Transaction&gt; 节点的上下文中创建一个具有此值的变量:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多