使用另一个xml中的映射替换属性的值?

时间:2017-09-15 22:35:01

标签: sql-server xml xpath xquery

我在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脚本?

如果我只有两种根元素<XX><YY>怎么办?

1 个答案:

答案 0 :(得分:0)

有点黑客,但请考虑以下

示例

tableView.rowHeight = UITableViewAutomaticDimension

<强>返回

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" 这是为了避免冲突和过度使用。