XDT Config Transforms - ReplaceAll?

У меня есть специальный раздел в моем файле web.config, похожий на эту структуру:

<Messages>
  <Message id="1'>
     <Property Name="foo" value="bar" />
  </Message>
  <Message id="2'>
     <Property Name="foo" value="bar2" />
  </Message>
</Messages>

Я хочу применить к этому настраиваемое преобразование, чтобы можно было изменить значение ВСЕХ экземпляров элемента Property с помощью Name = "foo", но, похоже, я не могу заставить его работать.

Я пробовал:

<Messages>
  <Message>
     <Property Name="foo" value="updated" xdt:Locator=Match(Name) xdt:Transform="Replace" />
  </Message>
</Mesasges>

Я могу удалить все элементы, заменив Transform = Replace на Transform = RemoveAll - есть идеи, как я могу добиться чего-то подобного, чтобы заменить все значения?


person Sean Bedford    schedule 28.09.2011    source источник
comment
Может, покажите, что пробовали?   -  person John Saunders    schedule 28.09.2011
comment
Извините, форматирование XMl досталось мне с первого раза. Обновлено сейчас   -  person Sean Bedford    schedule 28.09.2011


Ответы (1)


Похоже, что Transform: Replace заменяет только первый совпавший элемент из документации на msdn: ... Если выбрано более одного элемента, заменяется только первый выбранный элемент. Я решил эту проблему, используя комбинацию Match-Condition и SetAttributes, например:

<Messages>
  <Message>
    <Property value="updated" xdt:Locator=Condition(@Name='foo') xdt:Transform="SetAttributes(value)" />
  </Message>
</Messages>
person Emil G    schedule 09.12.2011
comment
для дополнительных пояснений из документации: ... Преобразование SetAttributes влияет на все выбранные элементы. Это отличается от атрибута преобразования "Заменить", который влияет только на первый выбранный элемент, если выбрано несколько элементов. - person Emil G; 09.12.2011
comment
Важно отметить, что XPath недостаточно для того, чтобы это работало. Структура XML в преобразовании должна отражать структуру преобразованного XML, поэтому, если узел Property был помещен в качестве корня преобразования, он не будет работать. Причем, работает только с SetAttributes, Replace тоже не будет - person SOReader; 20.07.2017