繁体   English   中英

XQuery - 迭代每个属性

[英]XQuery - iterate over every attribute

我正在尝试使用这种结构迭代 XML:

<Query id="Y120-M2-D1-H8-M42-S12-MS276-6676" name="Transactions_ModelGenerator_v_1.0.0.104">
  <Description />
  <Columns>
    <Column caption="Client Code" sorting="None" sortIndex="-1">
      <Expr class="ENTATTR" id="c.Number" />
    </Column>
    <Column caption="Client Name" sorting="None" sortIndex="-1">
      <Expr class="ENTATTR" id="c.Name" />
    </Column>
    <Column caption="Market Code" sorting="None" sortIndex="-1">
      <Expr class="ENTATTR" id="r.Number" />
    </Column>
    <Column caption="Market Name" sorting="None" sortIndex="-1">
      <Expr class="ENTATTR" id="r.Name" />
    </Column>
  </Columns>
  <JustSortedColumns />
  <Conditions linking="All">
    <Condition class="SMPL" enabled="True" readOnly="False">
      <Operator id="Equal" />
      <Expressions>
        <Expr class="ENTATTR" id="c.Number" />
        <Expr class="CONST" type="String" kind="Scalar" value="A1B" text="A1B" />
      </Expressions>
    </Condition>
    <Condition class="SMPL" enabled="True" readOnly="False">
      <Operator id="Equal" />
      <Expressions>
        <Expr class="ENTATTR" id="ConversionCurrency" />
        <Expr class="CONST" type="String" kind="Scalar" value="EUR" text="EUR" />
      </Expressions>
    </Condition>
  </Conditions>
</Query>

我想遍历列,并替换某些关键字,特别是标题属性。 例如,我想用“Cedent”替换关键字“Client”。

我试过写这样的东西:

update #data
set data.modify('
    for $col in /Query/Columns[1]/Column/caption
    replace value of $col with fn:replace($col, "Client", "Cedent")
    where fn:contains($col, "Client")
')

但当然我收到错误我不知道如何解决:

XQuery [#data.data.modify()]: Syntax error near 'replace', expected 'where', '(stable) order by' or 'return'.

我对 XQuery 不是很熟悉。 有人可以帮我吗?

   for $col in /Query/Columns[1]/Column/@caption[fn:contains(., "Client")]
   let $x := fn:replace($col, "Client", "Cedent")
   return replace value of node $col with $x

不幸的是, .modify()方法一次只能更新一个值。

由于 MS SQL Server 缺乏对XQueryXpath等最新 w3c 标准的支持,因此非常难看。

SQL

DECLARE @xml XML = N'<Query id="Y120-M2-D1-H8-M42-S12-MS276-6676" name="Transactions_ModelGenerator_v_1.0.0.104">
    <Description/>
    <Columns>
        <Column caption="Client Code" sorting="None" sortIndex="-1">
            <Expr class="ENTATTR" id="c.Number"/>
        </Column>
        <Column caption="Client Name" sorting="None" sortIndex="-1">
            <Expr class="ENTATTR" id="c.Name"/>
        </Column>
        <Column caption="Market Code" sorting="None" sortIndex="-1">
            <Expr class="ENTATTR" id="r.Number"/>
        </Column>
        <Column caption="Market Name" sorting="None" sortIndex="-1">
            <Expr class="ENTATTR" id="r.Name"/>
        </Column>
    </Columns>
    <JustSortedColumns/>
    <Conditions linking="All">
        <Condition class="SMPL" enabled="True" readOnly="False">
            <Operator id="Equal"/>
            <Expressions>
                <Expr class="ENTATTR" id="c.Number"/>
                <Expr class="CONST" type="String" kind="Scalar" value="A1B" text="A1B"/>
            </Expressions>
        </Condition>
        <Condition class="SMPL" enabled="True" readOnly="False">
            <Operator id="Equal"/>
            <Expressions>
                <Expr class="ENTATTR" id="ConversionCurrency"/>
                <Expr class="CONST" type="String" kind="Scalar" value="EUR" text="EUR"/>
            </Expressions>
        </Condition>
    </Conditions>
</Query>';

DECLARE @oldValue VARCHAR(10) = 'Client'
    , @NewValue VARCHAR(10) = 'Cedent'
    , @caption VARCHAR(30);

WHILE @xml.exist('/Query/Columns/Column[fn:contains(@caption, sql:variable("@oldValue"))]') = 1
BEGIN
    SET @caption = @xml.value('(/Query/Columns/Column[fn:contains(@caption, sql:variable("@oldValue"))]/@caption)[1]','VARCHAR(30)');
    SET @caption = REPLACE(@caption, @oldValue, @NewValue);

    SET @xml.modify('replace value of 
        (/Query/Columns/Column[fn:contains(@caption, sql:variable("@oldValue"))]/@caption)[1] with (sql:variable("@caption"))');
END

-- after
SELECT @xml;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM