2010-04-24 8 views
13

Sto avendo difficoltà con un modello che deve controllare 3 nodi differenti e se non sono vuote, stampare i datitest XSL vuote stringhe con <xsl:if> e smistamento

Sto usando <xsl:if test="string-length(node) != 0"> per ciascun nodo poi facendo l'uscita ma non sta stampando nulla. È come se il test restituisse zero.

Ho selezionato il nodo padre di ciascun nodo su cui voglio verificare la lunghezza come modello, ma non funziona ancora.

Un'altra cosa, come si ordina l'elenco utilizzando <datefrom>. Ho provato a utilizzare questo, ma ricevo un errore sul caricamento del foglio di stile. Se prendo il genere funziona

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <xsl:template name="hoo" match="/"> 
     <html> 
      <head> 
       <title>Registered Festival Organisers and Festivals</title> 
       <link rel="stylesheet" type="text/css" href="userfestival.css" /> 
      </head> 
      <body> 
       <h1>Registered Festival Organisers and Festivals</h1> 
       <h3>Ordered by the festival date ascending</h3>     
       <xsl:apply-templates select="folktask/member"/> 

       <xsl:if test="position()=last()"> 
        <div class="count"><h2>Total number of festival organisers: <xsl:value-of select="count(/folktask/member/user/account/userlevel[text()=3])"/></h2></div> 
        <div class="count"><h2>Total number of festivals: <xsl:value-of select="count(/folktask/member/festival)"/></h2></div> 
       </xsl:if>    
      </body> 
     </html> 
    </xsl:template> 

<xsl:template match="folktask/member"> 
    <xsl:if test="user/account/userlevel='3'"> 
     <xsl:sort select="festival/event/datefrom"/> 
     <div class="userdiv"> 
      <xsl:apply-templates select="user"/>  
      <xsl:apply-templates select="festival"/>  
     </div> 
    </xsl:if> 
</xsl:template> 

    <xsl:template match="user"> 
     <xsl:apply-templates select="@id" mode="userid"/> 
     <xsl:apply-templates select="personal/name"/> 
     <xsl:apply-templates select="personal/address1"/> 
     <xsl:apply-templates select="personal/city"/> 
     <xsl:apply-templates select="personal/county"/> 
     <xsl:apply-templates select="personal/postcode"/> 
     <xsl:apply-templates select="personal/telephone"/> 
     <xsl:apply-templates select="personal/mobile"/> 
     <xsl:apply-templates select="personal/email"/> 
     <xsl:apply-templates select="personal"/> 
     <xsl:apply-templates select="account/username"/> 
     <xsl:apply-templates select="account"/> 
    </xsl:template> 

    <xsl:template match="festival"> 
     <xsl:apply-templates select="@id" mode="festid"/> 
     <xsl:apply-templates select="event/eventname"/> 
     <xsl:apply-templates select="event/url"/> 
     <xsl:apply-templates select="event/datefrom"/> 
     <xsl:apply-templates select="event/dateto"/> 
     <xsl:apply-templates select="event/location"/> 
     <xsl:apply-templates select="event/eventpostcode"/> 
     <xsl:apply-templates select="event/coords/lat"/> 
     <xsl:apply-templates select="event/coords/lng"/> 
     <xsl:apply-templates select="contact/conname"/> 
     <xsl:apply-templates select="contact/conaddress1"/> 
     <xsl:apply-templates select="contact/conaddress2"/> 
     <xsl:apply-templates select="contact/concity"/> 
     <xsl:apply-templates select="contact/concounty"/> 
     <xsl:apply-templates select="contact/conpostcode"/> 
     <xsl:apply-templates select="contact"/> 
     <xsl:apply-templates select="contact/conemail"/> 
    </xsl:template> 

    <xsl:template match="@id" mode="userid"> 
     <div class="heading bold"><h2>USER ID: <xsl:value-of select="." /></h2></div> 
    </xsl:template> 

    <xsl:template match="personal/name"> 
     <div class="small bold">NAME:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="personal/address1"> 
     <div class="small bold">ADDRESS:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="personal/city"> 
     <div class="small bold">CITY:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="personal/county"> 
     <div class="small bold">COUNTY:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="personal/postcode"> 
     <div class="small bold">POSTCODE:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="personal/telephone"> 
     <div class="small bold">TELEPHONE:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="personal/mobile"> 
     <div class="small bold">MOBILE:</div> 
     <div class="large"><xsl:value-of select="." /> 
     </div> 
    </xsl:template> 

    <xsl:template match="personal/email"> 
     <div class="small bold">EMAIL:</div> 
     <div class="large"> 
      <xsl:element name="a"> 
       <xsl:attribute name="href"> 
        <xsl:text>mailto:</xsl:text> 
        <xsl:value-of select="." /> 
       </xsl:attribute> 
       <xsl:value-of select="." /> 
      </xsl:element> 
     </div> 
    </xsl:template> 

    <xsl:template match="personal"> 
     <div class="small bold">SEX:</div> 
     <div class="colored bold"> 
      <xsl:choose> 
       <xsl:when test="sex='Male'"> 
        <div class="sex male"><xsl:value-of select="sex/."/></div> 
       </xsl:when> 
       <xsl:otherwise> 
        <div class="sex female"><xsl:value-of select="sex/."/></div> 
       </xsl:otherwise> 
      </xsl:choose> 
     </div> 
    </xsl:template> 

    <xsl:template match="account/username"> 
     <div class="small bold">USERNAME:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 


    <xsl:template match="account"> 
     <div class="small bold">ACCOUNT TYPE:</div> 
     <div class="colored "> 
      <xsl:choose> 
       <xsl:when test="userlevel='1'"> 
        <div class="nml bold">Normal User</div> 
       </xsl:when> 

       <xsl:when test="userlevel='2'"> 
        <div class="vol bold">Volunteer</div> 
       </xsl:when> 

       <xsl:when test="userlevel='3'"> 
        <div class="org bold">Organiser</div> 
       </xsl:when> 

       <xsl:otherwise> 
        <div class="name adm bold">Administrator</div> 
       </xsl:otherwise> 
      </xsl:choose> 
     </div> 
    </xsl:template> 

    <xsl:template match="@id" mode="festid"> 
     <div class="heading2 bold"><h2>FESTIVAL ID: <xsl:value-of select="." /></h2></div> 
    </xsl:template> 

    <xsl:template match="eventname"> 
     <div class="small bold">EVENT NAME:</div> 
     <div class="large bold"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="url"> 
     <div class="small bold">URL:</div> 
     <div class="large"> 
      <xsl:element name="a"> 
       <xsl:attribute name="href"> 
        <xsl:value-of select="." /> 
       </xsl:attribute> 
       <xsl:value-of select="." /> 
      </xsl:element> 
     </div> 
    </xsl:template> 

    <xsl:template match="datefrom"> 
     <div class="small bold">DATE FROM:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="dateto"> 
     <div class="small bold">DATE TO:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="location"> 
     <div class="small bold">LOCATION:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="eventpostcode"> 
     <div class="small bold">POSTCODE:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="coords/lat"> 
     <div class="small bold">LATITUDE:</div> 
     <div class="large"><xsl:value-of select="." /> 
     </div> 
    </xsl:template> 

    <xsl:template match="coords/lng"> 
     <div class="small bold">LONGITUDE:</div> 
     <div class="large"><xsl:value-of select="." /> 
     </div> 
    </xsl:template> 

    <xsl:template match="conname"> 
     <div class="small bold">NAME:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="conaddress1"> 
     <div class="small bold">ADDRESS:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="conaddress2"> 
     <xsl:if test="string-length(conaddress2)!=0"> 
      <div class="small bold"><xsl:text>&#160;</xsl:text></div> 
      <div class="large"> 
       <xsl:value-of select="." /> 
      </div> 
     </xsl:if> 
    </xsl:template> 

    <xsl:template match="concity"> 
     <div class="small bold">CITY:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="concounty"> 
     <div class="small bold">COUNTY:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

    <xsl:template match="conpostcode"> 
     <div class="small bold">POSTCODE:</div> 
     <div class="large"><xsl:value-of select="." /></div> 
    </xsl:template> 

<xsl:template match="contact"> 
    <xsl:if test="string-length(contelephone)!=0"> 
     <div class="small bold">TELEPHONE:</div> 
     <div class="large"> 
      <xsl:value-of select="contelephone/." /> 
     </div> 
    </xsl:if> 

    <xsl:if test="string-length(conmobile)!=0"> 
     <div class="small bold">MOBILE:</div> 
     <div class="large"> 
      <xsl:value-of select="conmobile/." /> 
     </div> 
    </xsl:if> 

    <xsl:if test="string-length(fax)!=0"> 
     <div class="small bold">FAX:</div> 
     <div class="large"> 
      <xsl:value-of select="fax/." /> 
     </div> 
    </xsl:if> 
</xsl:template> 

    <xsl:template match="conemail"> 
     <div class="small bold">EMAIL:</div> 
     <div class="large"> 
      <xsl:element name="a"> 
       <xsl:attribute name="href"> 
        <xsl:text>mailto:</xsl:text> 
        <xsl:value-of select="." /> 
       </xsl:attribute> 
       <xsl:value-of select="." /> 
      </xsl:element> 
     </div> 
    </xsl:template> 

</xsl:stylesheet> 

E una sezione del mio xml. Se hai bisogno di me per modificare il mio post in modo da poter vedere il codice completo lo farò, ma il resto funziona bene.

<folktask> 
<member> 
    <user id="4"> 
    <personal> 
    <name>Connor Lawson</name> 
    <sex>Male</sex> 
    <address1>12 Ash Way</address1> 
    <address2></address2> 
    <city>Swindon</city> 
    <county>Wiltshire</county> 
    <postcode>SN3 6GS</postcode> 
    <telephone>01791928119</telephone> 
    <mobile>07338695664</mobile> 
    <email>[email protected]</email> 
    </personal> 
    <account> 
    <username>iTuneStinker</username> 
    <password>3a1f5fda21a07bfff20c41272bae7192</password> 
    <userlevel>3</userlevel> 
    <signupdate>2010-03-26T09:23:50</signupdate> 
    </account> 
    </user> 
    <festival id="1"> 
    <event> 
    <eventname>Oxford Folk Festival</eventname> 
    <url>http://www.oxfordfolkfestival.com/</url> 
    <datefrom>2010-04-07</datefrom> 
    <dateto>2010-04-09</dateto> 
    <location>Oxford</location> 
    <eventpostcode>OX1 9BE</eventpostcode> 
    <coords> 
    <lat>51.735640</lat> 
    <lng>-1.276136</lng> 
    </coords> 
    </event> 
    <contact> 
    <conname>Stuart Vincent</conname> 
    <conaddress1>P.O. Box 642</conaddress1> 
    <conaddress2></conaddress2> 
    <concity>Oxford</concity> 
    <concounty>Bedfordshire</concounty> 
    <conpostcode>OX1 3BY</conpostcode> 
    <contelephone>01865 79073</contelephone> 
    <conmobile></conmobile> 
    <fax></fax> 
    <conemail>[email protected]</conemail> 
    </contact> 
    </festival> 
</member> 
</folktask> 
+0

Non sono stati forniti il ​​codice XSLT con il problema principale. Per quanto riguarda '', può essere solo un figlio (immediato!) Di '' o ''. –

+0

Post modificato per mostrare l'intero codice per il foglio di stile XSL – AdRock

risposta

14

È possibile ordinare gli elementi quando si applica un modello:

<xsl:apply-templates select="folktask/member"> 
    <xsl:sort select="festival/event/datefrom"/> 
</xsl:apply-templates> 

Sei anche confondendo un po 'il vostro contesto nodo:

<xsl:template match="conaddress2"> 
    <xsl:if test="string-length(conaddress2)!=0"> 
    ... 
    </xsl:if> 
</xsl:template> 

dovrebbe probabilmente essere:

<xsl:template match="conaddress2"> 
    <xsl:if test="string-length(.)!=0"> 
    ... 
    </xsl:if> 
</xsl:template> 

Poiché la tua corrispondenza ing conaddress2 il nodo di contesto è impostato su conaddress2. Se si tenta di utilizzare string-length(conaddress2) da questo contesto, significa che si sta tentando di trovare un nodo figlio conaddress2 del nodo di contesto corrente (che è conaddress2). In altre parole, stai cercando di trovare la lunghezza di conaddress2\conaddress2.

Allo stesso modo in questo modello: "/"

<xsl:template match="contact"> 
    <xsl:if test="string-length(contelephone)!=0"> 
    <div class="small bold">TELEPHONE:</div> 
    <div class="large"> 
     <xsl:value-of select="contelephone/." /> 
    </div> 
    </xsl:if> 

    <xsl:if test="string-length(conmobile)!=0"> 
    <div class="small bold">MOBILE:</div> 
    <div class="large"> 
     <xsl:value-of select="conmobile/." /> 
    </div> 
    </xsl:if> 

    <xsl:if test="string-length(fax)!=0"> 
    <div class="small bold">FAX:</div> 
    <div class="large"> 
     <xsl:value-of select="fax/." /> 
    </div> 
    </xsl:if> 
</xsl:template> 

È possibile rimuovere il dalle espressioni selezionate. Così, invece di:

<xsl:value-of select="contelephone/." /> 

È possibile utilizzare

<xsl:value-of select="contelephone" /> 

(Anche se entrambi hanno lavorato lo stesso nel mio parser XSLT.)

+0

Molte grazie .... sembra così ovvio ora – AdRock