【问题标题】:Replace the value of attribute using mappings in another xml?使用另一个xml中的映射替换属性的值?
【发布时间】:2017-09-15 22:35:01
【问题描述】:

我在 Sql server 中定义了以下映射。

declare @map xml = '<Maps><Map From="1" To="2"/><Map From="3" To="4" /></Maps>';

我需要使用映射在(示例)xml 之后更改属性Id 的值。但是,根元素可以是任何东西,我想保留所有其他属性。

declare @x xml;

set @x = '<XX><Value Id="1" OtherAttrs="..." /><Value Id="3" /></XX>';
-- Expect <XX><Value Id="2" OtherAttrs="..." /><Value Id="4" /></XX>

set @x = '<YY><Value Id="3" /><Value Id="1" OtherAttrs="..." /></YY>';
-- Expect <YY><Value Id="4" /><Value Id="2" OtherAttrs="..." /></YY>

select @x.query('...') -- How to write the xquery?

如何编写 xquery 脚本?

如果我只有两种根元素&lt;XX&gt;&lt;YY&gt; 怎么办?

【问题讨论】:

  • 这是一个错字,我修正了它。谢谢。

标签: sql-server xml xpath xquery


【解决方案1】:

有点小技巧,但请考虑以下内容

示例

declare @map xml = '<Maps><Map From="1" To="2"/><Map From="3" To="4" /></Maps>';

Declare @X xml = '<XX><Value Id="1" /><Value Id="3" /></XX>'

Select @X = Replace(cast(@X as varchar(max)),MapFrom,MapTo)
 From (
        Select MapFrom = 'Id="'+n.value('@From','varchar(max)')+'"'
              ,MapTo   = 'Id="'+n.value('@To'  ,'varchar(max)')+'"'
         From  @map.nodes('/Maps/*') as X(n)
      ) A

Select @X

退货

<XX>
  <Value Id="2" />
  <Value Id="4" />
</XX>

如果它有助于可视化

子查询生成以下内容。

MapFrom   MapTo
Id="1"    Id="2"
Id="3"    Id="4"

您可能会注意到我包含了完整的字符串 {attribute name}="{value}" 这是为了避免冲突和超出范围。

【讨论】:

    猜你喜欢
    • 2019-10-13
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 2018-11-30
    • 2019-05-07
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    相关资源
    最近更新 更多