XML-элемент преобразования web.config

Я избавляюсь от пакетного файла конфигурации web.config (Hanselman) и хочу использовать функцию преобразования конфигурации в vs2010. Однако у меня возникли проблемы с преобразованием элемента xml (в отличие от атрибута элемента).

Это фрагмент моего web.config:

<Federation type="..." xmlns="...">
      <SigningCertificate .../>
      <AllowedAudienceUris>
               <Audience>https://audience.url.com</Audience>
      </AllowedAudienceUris>
</Federation>

Я хочу преобразовать элемент, вставив другой URL-адрес на основе конфигурации сборки. Можно ли это сделать?

Заранее спасибо!

/Джаспер


person jaspernygaard    schedule 02.03.2011    source источник


Ответы (3)


Один из подходов будет следующим:

<!-- Copy all nodes -->
<xsl:template match="@* | node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
</xsl:template>

<!-- Operate just on the AllowedAudienceUris (copy it), setting the Audience element -->
<xsl:template match="/Federation/AllowedAudienceUris">
    <xsl:copy>
        <Audience>https://hello.com</Audience>
    </xsl:copy>
</xsl:template>
person Scott Saad    schedule 02.03.2011
comment
@jaspernygaard Решение предполагает, что корневым элементом является /Federation. Вам нужно будет адаптировать его к истинной структуре xml. Вы всегда можете опубликовать более полную картину проблемы. - person Scott Saad; 03.03.2011
comment
@jaspernygaard Я не понимаю ... вопрос касается преобразования веб-конфигурации, которое основано на XDT, а не на XSLT. Фрагмент кода, представленный в этом ответе, явно XSLT. Как это принятый ответ? - person Saul Dolgin; 01.04.2012

Если элементы AllowedAudienceUris и Audience встречаются только один раз, опустить xdt:Locator тоже можно:

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <Federation>
    <AllowedAudienceUris xdt:Transform="Replace">
      <Audience>https://example.com</Audience>
    </AllowedAudienceUris>
  </Federation>
</configuration>
person Marco G    schedule 20.01.2012

Вы должны иметь возможность сделать это, используя атрибуты xdt:Locator и xdt:Transform.

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <Federation>
    <AllowedAudienceUris
        xdt:Transform="Replace"
        xdt:Locator="Condition(//Audience)">
      <Audience>https://example.com</Audience>
    </AllowedAudienceUris>
  </Federation>
</configuration>
person Brian Wigginton    schedule 19.01.2012
comment
Кажется, что это должно работать, но это не так, насколько я могу судить. - person Jeremy Holovacs; 30.11.2012