Попытка использовать XSLT для изменения учетной записи и передачи в AdMemberShipProvider в конфигурации приложения ... выглядит правильно, но это не работает - PullRequest
1 голос
/ 15 февраля 2012

Дайте это в конфигурации приложения:

  <system.web>
    <membership defaultProvider="ClientAuthenticationMembershipProvider">
      <providers>
        <add name="MyADMembershipProvider" 
             type="System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 
             connectionStringName="ADConnectionString" 
             connectionUsername="XXXXXXX" 
             connectionPassword="YYYYYYY" 
             attributeMapUsername="SAMAccountName" 
             />
        <add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" />
      </providers>
    </membership>

И это преобразование xslt:

  <xsl:template match="/configuration/system.web/membership/providers/add[@name='MyADMembershipProvider']/@connectionUsername" >
    <xsl:attribute name="connectionUsername">
      <xsl:text>TestUser</xsl:text>
    </xsl:attribute>
  </xsl:template>

Может кто-нибудь сказать, пожалуйста, почему XXXXXXX не заменяется на TestUser? остальные мои простые свопы XSLT работают так, как я ожидал.

По какой-то причине эти два не работают.

Я использую движок .Net xslt.

Спасибо

кальцит

Ответы [ 3 ]

1 голос
/ 15 февраля 2012

Это преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match="add[@name = 'MyADMembershipProvider']">
  <add connectionUsername="TestUser">
   <xsl:apply-templates select=
   "@*[not(name()='connectionUsername')]
   | node()
   "/>
  </add>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному документу XML (в элементе configuration):

<configuration>
    <system.web>
        <membership defaultProvider="ClientAuthenticationMembershipProvider">
            <providers>
                <add name="MyADMembershipProvider"
                  type="System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
                  connectionStringName="ADConnectionString"
                  connectionUsername="XXXXXXX"
                  connectionPassword="YYYYYYY"
                  attributeMapUsername="SAMAccountName"
                />
                <add name="ClientAuthenticationMembershipProvider"
                type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
                serviceUri="" />
            </providers>
        </membership>
    </system.web>
</configuration>

дает требуемый, правильный результат (атрибут connectionUsername изменен на "TestUser"):

<configuration>
   <system.web>
      <membership defaultProvider="ClientAuthenticationMembershipProvider">
         <providers>
            <add connectionUsername="TestUser" name="MyADMembershipProvider"
            type="System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
            connectionStringName="ADConnectionString"
            connectionPassword="YYYYYYY"
            attributeMapUsername="SAMAccountName"/>
            <add name="ClientAuthenticationMembershipProvider"
            type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
            serviceUri=""/>
         </providers>
      </membership>
   </system.web>
</configuration>

Примечание :

  1. Нет xsl:attribute используется вообще.

  2. Шаблон шаблона шаблона, который переопределяет правило идентификации , включает дополнительную контекстную информацию - чтобы избежать случая, когда все атрибуты connectionUsername на всех add элементы модифицируются так, чтобы иметь одинаковое значение "TestUser" - как это произошло бы с другим предоставленным ответом на этот вопрос.

1 голос
/ 15 февраля 2012

Это работает:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

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

  <xsl:template match="//membership/providers/add[@name='MyADMembershipProvider']/@connectionUsername" >
    <xsl:attribute name="connectionUsername">
      <xsl:text>TestUser</xsl:text>
    </xsl:attribute>
  </xsl:template>
</xsl:stylesheet>

Я думаю, что иерархия XPath не идеальна, потому что XPath в вашем XSL-коде похож на

/configuration/system.web/membership/providers/add

и корневой узел в вашем примере XML равен

<system.web>
1 голос
/ 15 февраля 2012

Очевидно, вы хотите скопировать все, кроме изменения значения атрибута connectionUserName.Это может быть достигнуто с помощью преобразования ниже.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">

    <xsl:output method="xml" indent="yes"/>

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

    <xsl:template match="@connectionUsername">
        <xsl:attribute name="connectionUsername">TestUser</xsl:attribute>
    </xsl:template>
</xsl:stylesheet>

Добавьте конечный тег </system.web> к входному XML-файлу.

EDITED

По запросу я изменил значение атрибута соответствия в шаблоне, чтобы обновлять атрибут connectionUserName только для определенных элементов добавления.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">

    <xsl:output method="xml" indent="yes"/>

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

    <xsl:template match="@connectionUsername[../@name='MyADMembershipProvider']">
        <xsl:attribute name="connectionUsername">TestUser</xsl:attribute>
    </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...