2012-04-12 18 views
0

我有一个XSLT文件,用于写入我的Web.Config作为Umbraco构建过程的一部分。写入诸如“umbracoConfigurationStatus”值之类的东西可以正常工作,就像编写新的配置文件成员资格部分一样。为什么XSLT更新Web.Config会部分失败?

但是,尝试更新或创建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" /> 

回答

2

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

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

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

你调用的命名模板拷贝儿童虽然,但所有这确实是一个XSL:复制的将复制确切孩子节点,但将不匹配可能存在于他们的任何模板。

副本儿童模板更改为以下内容,并查看如何继续。

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

作为一个侧面说明,有没有真正需要使用的xsl:元素的xsl:属性创建的元素,如果你总是使用固定的名称属性。除了上述改变拷贝儿童模板:例如

<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中可能出现的所有实例。

+0

好看的解决方案,但仍然没有奏效。什么可以阻止这条线? – 2012-04-14 21:59:34

+0

在没有看到你的web.config文件的情况下说有点棘手 – 2012-04-15 08:14:32

+0

我已经在这里添加了完整的文件:http://pastebin.com/juKagtxv。有趣的是,如果我删除以“开头的部分,则更新成功,但仅限于某一点,返回错误:”无法添加属性和命名空间节点在已添加文本,注释,pi或子元素节点之后添加到父元素。“ – 2012-04-16 10:57:07