2012-04-12 4 views
0

Ich habe eine XSLT-Datei, die zum Schreiben in meine Web.Config als Teil eines Build-Prozesses für Umbraco verwendet wird. Das Schreiben von Dingen wie dem "umbracoConfigurationStatus" -Wert funktioniert genauso gut wie das Schreiben eines neuen Profilmitgliedschaftsteils.Warum sollte das XSLT-Update für Web.Config teilweise fehlschlagen?

Der Teil, der versucht, einen UmbracoMembershipProvider-Abschnitt zu aktualisieren oder zu erstellen, verursacht jedoch alle Arten von Kummer. Es wird nicht aktualisiert oder geschrieben. Was vermisse ich?

Hier ist der Großteil der XSLT-Datei:

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

Der Zustand, den ich zu bekommen bin versucht:

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

Antwort

2

ich das denken, weil Sie eine Vorlage haben die Konfiguration anzupassen /system.web Element ...

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

... aber innerhalb dieses, was Sie tun Sagen Sie dem XSLT-Prozessor nicht, dass er weiterhin alle Vorlagen mit den Nachkommen abgleichen soll. Das heißt, die Vorlage für Konfiguration/System.Web/Mitgliedschaft/Anbieter wird nicht zugeordnet.

Sie tun, um die benannten Vorlage copy-Kinder obwohl nennen, aber all dies tut, ist eine xsl: copy-of, die die Kinder kopiert Knoten genau, aber nicht alle Vorlagen übereinstimmen, die für sie existieren .

Ändern Sie die Kopie-Kinder Vorlage auf die folgenden, und sehen Sie, wie Sie kommen.

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

Als Randbemerkung, gibt es keine wirkliche Notwendigkeit xsl zu verwenden: Element und xsl: attribute Elemente zu erstellen und Attribute, wenn Sie immer ein festgelegten Namen. Zum Beispiel

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

Dies könnte einfach durch die folgenden ersetzt werden, die die Größe Ihres XSLT schneiden könnten

<add name="UmbracoMembershipProvider" /> 

EDIT unten: Neben Ändern der Kopie-Kinder Vorlage, wie oben beschrieben , ein anderes Problem, das Sie möglicherweise haben, ist mit dieser zusammenpassenden Schablone.

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

Hier passen Sie ein Element an, aber ersetzen Sie es durch ein Attribut. Dies ist in Ordnung, wenn Sie (wie in der Fehlermeldung beschrieben) zuvor noch keine Text- oder untergeordneten Elemente hinzugefügt haben. Ich vermute, Sie sollten diese stattdessen tun ....

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

Dies wird fügen Sie eine Kopie des Element Mitgliedschaft erstellen und ein Attribut hinzufügen.

Sie sollten alle Instanzen überprüfen, in denen dies in Ihrem XSLT auftreten könnte.

+0

Gut aussehende Lösung, hat aber immer noch nicht funktioniert. Was könnte diese Linie blockieren? –

+0

Es ist ein bisschen schwierig zu sagen, ohne Ihre web.config-Datei zu sehen –

+0

Ich habe die vollständige Datei hier hinzugefügt: http://pastebin.com/juKagtxv. Interessanterweise, wenn ich den Abschnitt entferne, der mit '' beginnt, ist die Aktualisierung erfolgreich, aber nur bis zu einem Punkt, der einen Fehler zurückgibt: "Attribute und Namespace-Knoten können nicht hinzugefügt werden zu dem Elternelement, nachdem ein Text-, Kommentar-, Pi oder Unterelementknoten bereits hinzugefügt wurde. " –

Verwandte Themen