0

我有一个 XSLT 文件,用于写入我的 Web.Config 作为 Umbraco 构建过程的一部分。编写诸如“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" />

编辑:除了如上所述更改复制子模板外,您可能遇到的另一个问题是此匹配模板。

<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 回答