0

Umbraco のビルド プロセスの一部として Web.Config への書き込みに使用される XSLT ファイルがあります。「umbracoConfigurationStatus」値などの書き込みは正常に機能し、新しいプロファイル メンバーシップ セクションの書き込みも同様です。

ただし、UmbracoMembershipProvider セクションを更新または作成しようとする部分は、あらゆる種類の悲しみを引き起こしています。更新も書き込みもしません。私は何が欠けていますか?

XSLT ファイルの大部分は次のとおりです。

  <xsl:template match="/configuration/appSettings/add[@key='umbracoConfigurationStatus']/@value">
    <xsl:attribute name="value">4.7.1.1</xsl:attribute>
  </xsl:template>

    <xsl:template match="/configuration/system.web">
        <xsl:copy>
            <xsl:call-template name="copy-children" />
            <xsl:element name="profile">
                <xsl:attribute name="defaultProvider">
                    <xsl:text>UmbracoMemberProfileProvider</xsl:text>
                </xsl:attribute>
                <xsl:attribute name="enabled">
                    <xsl:text>true</xsl:text>
                </xsl:attribute>
                <xsl:attribute name="inherits">
                    <xsl:text>umbraco.cms.businesslogic.member.MemberProfile</xsl:text>
                </xsl:attribute>
                <xsl:element name="providers">
                    <xsl:element name="clear" />
                    <xsl:element name="add">
                        <xsl:attribute name="name">
                            <xsl:text>UmbracoMemberProfileProvider</xsl:text>
                        </xsl:attribute>
                        <xsl:attribute name="type">
                            <xsl:text>umbraco.providers.members.UmbracoProfileProvider, umbraco.providers</xsl:text>
                        </xsl:attribute>
                    </xsl:element>
                </xsl:element>
                <xsl:element name="properties">
                    <xsl:element name="clear" />
                    <xsl:element name="add">
                        <xsl:attribute name="name">
                            <xsl:text>auth_guid</xsl:text>
                        </xsl:attribute>
                        <xsl:attribute name="allowAnonymous">
                            <xsl:text>false</xsl:text>
                        </xsl:attribute>
                        <xsl:attribute name="provider">
                            <xsl:text>UmbracoMemberProfileProvider</xsl:text>
                        </xsl:attribute>
                        <xsl:attribute name="type">
                            <xsl:text>System.String</xsl:text>
                        </xsl:attribute>
                    </xsl:element>
                    <xsl:element name="add">
                        <xsl:attribute name="name">
                            <xsl:text>firstName</xsl:text>
                        </xsl:attribute>
                        <xsl:attribute name="allowAnonymous">
                            <xsl:text>false</xsl:text>
                        </xsl:attribute>
                        <xsl:attribute name="provider">
                            <xsl:text>UmbracoMemberProfileProvider</xsl:text>
                        </xsl:attribute>
                        <xsl:attribute name="type">
                            <xsl:text>System.String</xsl:text>
                        </xsl:attribute>
                    </xsl:element>
                    <xsl:element name="add">
                        <xsl:attribute name="name">
                            <xsl:text>lastName</xsl:text>
                        </xsl:attribute>
                        <xsl:attribute name="allowAnonymous">
                            <xsl:text>false</xsl:text>
                        </xsl:attribute>
                        <xsl:attribute name="provider">
                            <xsl:text>UmbracoMemberProfileProvider</xsl:text>
                        </xsl:attribute>
                        <xsl:attribute name="type">
                            <xsl:text>System.String</xsl:text>
                        </xsl:attribute>
                    </xsl:element>
                </xsl:element>
            </xsl:element>
        </xsl:copy>
    </xsl:template>

    <xsl:template name="copy-children">
        <xsl:copy-of select="./*"/>
    </xsl:template>

    <xsl:template match="/configuration/system.web/membership/providers">
        <xsl:copy>
            <xsl:call-template name="copy-children" />
            <xsl:element name="add">
                <xsl:attribute name="name">
                    <xsl:text>UmbracoMembershipProvider</xsl:text>
                </xsl:attribute>
                <xsl:attribute name="type">
                    <xsl:text>umbraco.providers.members.UmbracoMembershipProvider</xsl:text>
                </xsl:attribute>
                <xsl:attribute name="enablePasswordRetrieval">
                    <xsl:text>false</xsl:text>
                </xsl:attribute>
                <xsl:attribute name="enablePasswordReset">
                    <xsl:text>false</xsl:text>
                </xsl:attribute>
                <xsl:attribute name="requiresQuestionAndAnswer">
                    <xsl:text>false</xsl:text>
                </xsl:attribute>
                <xsl:attribute name="defaultMemberTypeAlias">
                    <xsl:text>SiteMember</xsl:text>
                </xsl:attribute>
                <xsl:attribute name="umbracoApprovePropertyTypeAlias">
                    <xsl:text>isApproved</xsl:text>
                </xsl:attribute>
                <xsl:attribute name="umbracoLockPropertyTypeAlias">
                    <xsl:text>isLocked</xsl:text>
                </xsl:attribute>
                <xsl:attribute name="passwordFormat">
                    <xsl:text>Hashed</xsl:text>
                </xsl:attribute>
            </xsl:element>
        </xsl:copy>
    </xsl:template>

    <!-- Default templates to match anything else -->
  <xsl:template match="@*">
    <xsl:copy/>
  </xsl:template>

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

私が到達しようとしている状態は次のとおりです。

<add name="UmbracoMembershipProvider" type="umbraco.providers.members.UmbracoMembershipProvider" enablePasswordRetrieval="false" enablePasswordReset="false" requiresQuestionAndAnswer="false" defaultMemberTypeAlias="SiteMember" umbracoApprovePropertyTypeAlias="isApproved" umbracoLockPropertyTypeAlias="isLocked" passwordFormat="Hashed" />
4

1 に答える 1

2

これは、 configuration/system.web要素に一致するテンプレートがあるためだと思います...

<xsl:template match="/configuration/system.web">

... しかし、この中では、XSLT プロセッサに子孫に対するテンプレートの照合を続行するように指示しません。つまり、configuration/system.web/membership/providersのテンプレートは一致しません。

ただし、名前付きテンプレートcopy-childrenを呼び出しますが、これはxsl:copy-ofだけで、子ノードを正確にコピーしますが、子ノードに存在する可能性のあるテンプレートとは一致しません。

copy-childrenテンプレートを次のように変更して、うまくいくか見てみましょう。

<xsl:template name="copy-children">
   <xsl:apply-templates select="*"/>
</xsl:template>

補足として、常に固定名を使用している場合は、要素と属性を作成するためにxsl:elementxsl:attributeを使用する必要はありません。例えば

<xsl:element name="add">
   <xsl:attribute name="name">
      <xsl:text>UmbracoMembershipProvider</xsl:text>
   </xsl:attribute>
<xsl:element>

これを次のように置き換えるだけで、XSLT のサイズを削減できます。

<add name="UmbracoMembershipProvider" />

編集:上記のようにcopy-childrenテンプレートを変更するだけでなく、この一致するテンプレートに別の問題が発生する可能性があります。

<xsl:template match="/configuration/system.web/membership">
   <xsl:attribute name="MyAttrTest">the test value</xsl:attribute>
</xsl:template>

ここでは、要素を一致させていますが、それを属性に置き換えています。(エラー メッセージに記載されているように) テキストまたは子要素を以前に追加していなければ、これで問題ありません。代わりにこれを行うべきだと思います....

<xsl:template match="/configuration/system.web/membership">
   <xsl:copy>
      <xsl:attribute name="MyAttrTest">the test value</xsl:attribute>
   </xsl:copy>
</xsl:template>

これにより、メンバーシップ要素のコピーが作成され、属性が追加されます。

XSLT でこれが発生している可能性があるすべてのインスタンスを再確認する必要があります。

于 2012-04-13T07:30:13.340 に答える