为什么XSLT更新Web.Config部分失败?

时间:2012-04-12 19:54:52

标签: xslt web-config umbraco

我有一个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" />

1 个答案:

答案 0 :(得分:2)

我认为这是因为你有一个模板来匹配配置/ system.web 元素......

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

...但在此范围内,您不会告诉XSLT处理器继续匹配后代的任何模板。这意味着, configuration / system.web / membership / providers 的模板将不匹配。

您确实调用了命名模板 copy-children ,但所有这一切都是 xsl:copy-of ,它将完全复制子节点,但赢得了' t匹配可能存在的任何模板。

copy-children 模板更改为以下内容,并了解您的使用方式。

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

作为旁注,如果您始终使用固定名称,则无需使用 xsl:element xsl: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中可能发生这种情况的所有实例。