我有一个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" />
答案 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中可能发生这种情况的所有实例。